1、最高级:出现同级别运算符时的结合方向是从左往右(下面级别没写结合顺序时,默认是从左往右)。
( )圆括号
[ ]下标运算符号
->指向结构体成员运算符
.结构体成员运算符
2、第二级:!、~、++、--、-、(类型)、*、&、sizeof。
这一级都是单目运算符号,这一级的结合方向是从右向左。
比如出现*p++,这时*和++同级别,先算右边,再左边。
所以*p++等价于*(p++),而不是(*p)++。
3、第三级:+、-、*、/、%
这一级都是算术运算符,结合顺序和数学学习中一致的,先乘除取余数,后加减。
4、第四级:<<、>>
这是左移、右移运算符,位运算时可能需要用到。
5、第五级:<、<=、>、>=、!=、==
这些运算符也称为关系运算符,其中<、<=、>、>=高于!=、==。
6、第六级:&、^、|
这三个符号也是位运算符号,其中内优先级,&>^>|。
7、第七级:&&、||
逻辑与&&优先级大于逻辑或||。
8、第八级:? :
也称为条件运算符号,是C语言中唯一的一个三目运算符,结合顺序是从右往左。
9、第九级:=、+=、-+、*=、/=、%=
这些运算符也叫做赋值运算符,除此之外,>>=、<<=、&=、^=、|=这些赋值运算符也在这一级别内,结合顺序是从右往左。
10、最低级:,
逗号运算符也称为顺序求值运算符,在C语言中,运算级别最低。
操作数、运算符、左值、右值
操作数:程序操纵的数据实体,该数据可以是数值、逻辑值或其它类型。可以是常量也可以是变量。
根据运算符可操作的操作数个数,可以将运算符分为一元,二元,三元运算符
左右值:赋值符号'=' ,左边的为左值,右边的为右值
如果是左值,就既可以赋值也可以取值,如果只有右值那么就只能取值而不能赋值
如c 只有左值,那么你可以把c赋给别人如 b = c + 1;
也可以赋值 c = 100;
但定义时如果加了const 就不一样了,const int x = 100;
那么此时x就只有右值
而100 只有右值,你不能放在左边,100 = 20;//就不能这样
所有的*= /= %= += 的优先级要比加减乘除的优先级低多了
int a = 3 , b = 4, c = 5 ;
a *= b + 5; // a = a * ( b + 5 )
?: 三目运算符
三目运算符:表达式1?表达式2:表达式3 (如果表达式1为真则取表达式2的值,否则取表达式3的值)
主要就是用这个代替一些简单的if语句
int main()
{
int a = 0, b = 0;
int max = 0;
scanf("%d %d", &a, &b);
if (a > b)
{
max = a;
}
else
{
max = b;
}
printf("max = %d\n", max);
return 0;
}
而如果用三目运算符的话就会快很多
int main()
{
int a = 0, b = 0;
int max = 0;
scanf("%d %d", &a, &b);
max = a > b ? a : b;
printf("max = %d\n", max);
return 0;
}
自增自减(非常重要)
在所有运算符中只有自增、自减运算符(i++,++i,i--,--i 等)有回写的能力
int main()
{
int a = 10, b = 10;
int x = 0;
x = ++a; //第一步
printf("x = %d a = %d\n", x, a);
x = b++; //第二步
printf("x = %d b = %d\n", x, b);
return 0;
}
第一步 :把++a 赋值给x
首先是把a的值取出来,放入临时的空间中;再对a的值自增1;自增1后,把11回写给a,此时a的值变成了11,再接着把a的值赋给x
最后输出的结果是x = 11 a = 11
第二步:把b++的值赋给x
首先把b的值取出来直接赋给x;再把b的值取出来放在临时空间中,自增1,再把11回写给b
所以打印的结果是x = 10 b = 11
这两个要注意区分
但如果仅仅是简单的进行a++或++a,而不进行赋值时,这两个变量没什么区别,可以互换
如 for 循环中 for (int i = 0;i < n ;++i) 把for循环中的++i 替换成i++ 其实也可以
如果是对小数进行自增自减,只能在整数位上面实现
float ft = 12.23;
++ft;
printf("%f \n", ft);
打印出来的ft = 13.23
由于自增自减有回写能力,所以不能对常量进行自增自减
100++; 不能这样写,因为100是个右值,只能读取不能写,而自增在把数读取加加后会把值回写给100,但100不可写。