C语言共有15个操作符优先级,从高到低如下
1 () [] . ->
2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof (注意这也是操作符,不是函数)
3 * / %
4 + -
5 >> <<
6 > >= < <=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += -= *= /= %= |= ^= &= >>= <<=
15 ,逗号运算符
结合性:分为左结合性(即从左到右)和右结合性(从右到左)
优先级中只有三个优先级是右结合性:
0. 单目运算符:包括-,+,++,--,*(指针取值运算符),&(取地址运算符),~,sizeof等
1. 条件运算符 ?:
3.赋值运算符 :包括=,/=,+=,-=,*=,<<=,>>=,|=,%=等
其中均为左结合性,分析操作符时,先看优先级再看结合性
规律如下:其实具有最高优先级的操作符并不算真正的操作符,均为一种特殊操作,其中()和函数有关,[]和数组有关,->,.和结构成员有关
次级运算符便是单目运算符,所有单目运算符具有相同的优先级,按结合性也就是右结合性来计算,由此可见单目运算符才是真正的优先级最高的操作符。
括号成员第一
全体单目第二 (算术运算符等)
移位紧随第三
关系移位后,有点不服气 (<<=,>>=竟然关系==,!=优先级高)
位在逻辑前面走 (&,^,|)
逻辑再靠后 当然除单目 (其实就剩或||和与&&)
条件高赋值 (?:)
赋值只能排倒二 (=,-=,+=。。。)
逗号永远倒一,威武霸气不解释
关于sizeof也要注意,不是函数啊哥,只是操作符,C专家编程提出的问题:apple = sizeof(int)*p结果会是多少
分析:sizeof为单目运算符,()优先级最高,*可能为乘法运算,可能为指针取地址运算符,这样与sizeof优先级一样
经验证,先执行sizeof(int) 再执行*p,即*为乘法
其执行时从左到右,用int a = sizeof (8)*20 验证发现结果为80,可见执行过程确实如上,若把20换为指针,语法会出错