运算符和表达式
-
算术运算符
运算符 描述 结合性 + 单目正/双目加 从右到左/从左到右 - 单目负/双目减 从右到左/从左到右 * 乘 从左到右 / 除和整除 从左到右 % 取模(取余) 从左到右 总结 :
- 除法运算符包括除和整除两种运算,当除数和被除数都是整型数时,结果只保留整数部分而自动舍弃小数部分,0不能作为除数。除数和被除数只要有一个浮点数,进行浮点数相除。
- 取模运算符要求两个操作数只能是整数。
- 求商的运算符/,和求余的运算符%,只要操作数中有一个是负数,运算结果就要取决于编译器。(这个可以动手验证一下,比如GCC和Windows下的VC++就是不一样的)。
- 运算中有不同类型的操作数,就会进行"隐式类型转换"。较小类型的操作数会向较大类型的操作数,然后再进行运算。因此当一个运算中基友int 也有double时个操作数就会被转换成double类型。
-
算术表达式
-
运算符优先级,运算符优先级由高到低排列如下:
( ),++,-(负号运算符),–,*,/,%,+,-
-
类型转换
1.自动类型转换;
char,short->int->unsigned->long->double<-float
转换规则:精度低的向精度高的转换。
2.强制类型转换:
(类型名) 表达式
利用强制类型转换可以将一个表达式的结果转换成所需要的类型。
注意:当将高精度的类型转换成低精度的类型时,有时可能造成数据丢失。
无论自动转换还是强制转换,都只是为了本次运算的需要而对变量的数据长度进行临时的性的转化,而不改变数据说明时对该变量定义的类型
即转换只是临时的,数据本身的类型并没有改变。变量数据的类型在定义它的时候就已经决定了
-
赋值运算符
1.单纯赋值运算符"="
它是个双目运算符,结合性是从右到左。
注意:赋值运算符也是存在隐式的类型转换的,赋值运算符右边的会转换成赋值运算符左边。2.复合赋值运算符
在"=“前面加上其他运算符,即构成复合的运算符,如”+=、-=、*=、/="等。
如:a+=b ====>a=a+b;记主两个不常见的:
a >>=b—>a=a>>b;
a<<=b—>a=a<<b;
3.赋值表达式
<变量名><赋值运算符><表达式>,即变量=表达式
注意:赋值表达式的左侧只能是一个变量名,而不能是一个表达式,如:a+b=b+c,是不对的
赋值运算符的右边也可以是赋值表达式,例如:
int a=b=c=2;
即将a,b,c都赋值为2。4.特殊的赋值运算符
-
自增"++"
他的作用是使变量的值加1。
-
自减运算符"–"
它的作用是使变量的值减1。
-
总结
自增和自减运算符的结合方向是自右向左
自增自减在前,变量会先执行自增或自减再进行其他操作
自增自减在后,变量会现参与运算在执行自增和自减
5.赋值中的类型转换
-
在进行赋值运算时,会遵循将表达式右侧的值的类型转换成表达式左边的值的类型。(
赋值时的类型转换是指上是强制的
) -
浮点型与整型
将浮点型转换成整型时,将舍弃浮点数的小数部分,只保留整数部分。将整型值赋给浮点型变量,数值不变,即小数点后带若干个0.
-
单双精度浮点型
由于C语言中的浮点数总是用双精度来表示的,所以float型数据只是尾部加0延长为double型数据参加运算。然后直接赋值。double转成float型通过截尾数来实现,截断前要进行四舍五入操作。
注意:对于double类型的数值,使用printf函数来显示时,转换说明是%f;当用scanf函数来读取时,转换说明是%lf。 -
char型与int型
int 型赋值char形时,只保留其最低八位,高位舍弃。
char型赋值给int型变量时,有些编译程序不管其值大小,都做正数处理。有些编译程序在转换时,若char型数据值大于127,就做负数处理。对于使用者来说,如果原来的char型数据取正值,转换后仍为正值;如果原来的char型可正可负,则转换后仍然保持原值,只是数据的内部表示形式有所不同。(这点在我们编程中很常见所以应该注意,以免会犯一些不易察觉的错误)
-
int和long型
long型赋值个int型值,将低16位赋值给int型变量,而将高十六位阶段舍弃。(这里假设int占两个字节)
而将int型赋值给long 型时,其外不值保持不变,而内部形式有所改变。
-
无符号整数
unsigned赋值给signed时,内部的存储形式保持不变,但是外部的值却可能改变。
而将一个signed型整型数据赋值给长度相同的unsigned型变量时,内部的存储形式不变,但外部表示时总是无符号的。
6.逗号运算符和表达式
-
C语言中","也是一种运算符,称为逗号运算符。其功能是将两个两个表达式连接起来组成一个表达式。
表达式1,表达式2
如:y=(x=a+b),c+d;
本例中,y是整个表达式的值,也就是表达式2的值,x是第一个表达式的值。对于逗号表达式:
-
逗号表达式一般形式中的表达式1,和表达式2也可以是逗号表达式的值。
将其进行扩展为"表达式1,表达式2,表达式3…表达式n",整个逗号表达式的值就是表达式n的值。
-
程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值。
-
并不是在所有出现逗号的地方都组成逗号表达式,如在白能量的说明中,函数参数表中逗号只是用于各变量之间的间隔符。
例如:y=(z=8,x=5,y=3);
z赋值为3,x赋值为5,y赋值为3。
z = (x=5,y=6,x+y);
z赋值为11,x赋值为,y赋值为6;
-
7.位运算符与表达式
-
位运算符
位运算符是指进行二进制位运算。
-
与运算符(&)
双目操作符,当两个进行相与时,只有两者都为"1"时结果才为"1"
-
或运算符(|)
双操作符,当当两个位进行相或时,只要其中有一方为1,结果就为1。
-
异或操作符(^)
相同为0,不同为1。
-
移位操作符(<<或>>)
区分逻辑移位与算术移位。
-
-
位表达式
在这些位运算符中,取反运算符优先级别最高,其次是移位运算符,再次是与或,异或。
在实际使用中,通常是用其进行赋值运算。
如:a<<=2 ---->a=a<<2;
记住:这种复合运算符的执行效率更高。
8.关系运算符和表达式
-
关系运算符(>,<,==,<=,>=)
-
关系表达式
关系表达式的值一般为0,则为假,非0则为真。
很多时候我们的条件表达式中会以关系表达式的值来作为判断的依据。
9.逻辑运算符和表达式
-
逻辑运算符
运算符 含义 && 逻辑与 || 或 ! 非 -
逻辑表达式
表达式 逻辑运算符 表达式
如:a>b && c>d
10.sizeof操作符
-
sizeof是一个单目运算符,他的运算对象是变量或数据类型,运算结果为一个整数类型。运算的一般形式如下:
-
sizeof(<类型或变量名>)
注意:
sizeof只针对数据类型,不针对变量
11.条件运算符
-
条件运算符是C语言中唯一一个三目运算符
<表达式1> ? <表达式2> :<表达式3>
其运算规则是:表达式1为真则执行表达式2,为假则执行表示式3。
12.运算符优先级总结
- 口诀:
- 全体成员第一([],(),成员运算符.,->)
- 全体单目第二(++,–,+(正),-(负))
- 乘除余三,加减四
- 移位五,关系六
- 等于不等排第七
- 位与异或和位或,三分天下八九十。
- 逻辑或跟与十二和十一
- 条件高于赋值
- 逗号运算即最低
-
-
- 当然了,我们平时编程时不一定非得记住这个,但是还是要对这个心里有数。这样才能编写出高效可靠的程序来。