文章目录
运算符优先级
1.1 基本算数运算符
算数运算符:( +、- ) < ( *、/、% )
输出:11 (1.1.1)
1 (1.1.2)
0 (1.1.3)
1 (1.1.4)
在复杂的表达式里,使用括号有助于读者搞清楚操作符与操作数之间的关联关系。
1.2 赋值操作符
优先级:==(判等) > =(赋值)
输出:10 (1.2.1)
40 (1.2.2)
1 (1.2.3)
1 (1.2.4)
1.3 逻辑操作符和增量操作符
优先级:逻辑( && > | | )
输出:1 (1.3.1)
1 (1.3.2)
2 (1.3.3)
0
3 (1.3.4)
0
? (1.3.5)
在这个程序里,“PRINT”宏有一个形式参数int。“PRINT(x)”是使用实际参数“x”进行的“PRINT”调用。在 扩展“PRINT”调用的时候,”C语言预处理器会先把宏定义里的所有 “int” 替换为 “x”,再把宏调“PRINT(x)”替换为结果字符串“printf(“%d\n”,x)”。请注意,形式参数 int 并不是匹配单词 “printf” 里的 “int” 字符的。这是因为宏定义里的形式参数是标识符——具体到这个例子,形式参数int只对标识符 int 进行匹配和替换。
etc: x+++++y // 解释为 x++ ++ + y (表达式非法)
为避免产生二义性,如果一个字符串能够解释为多个操作符,C语言编译器将按照“构成操作符的字符个数越多越好”的原则来作出选择。
*(1.3.5)*当表达式中存在对同一个变量有多种不同优先级运算操作时,请注意,C语言并没有对这种“副作用1”作出明确的规定,而是由C编译器的编写者决定的。这个例子的教训是:如果你无法断定会不会产生副作用,那么就尽量不要写这样的表达式。
1.4 二进制位操作符
优先级:按位( & > ^ > | ) > 逻辑
输出:3 (1.4.1)
3 (1.4.2)
1 (1.4.3)
1 (1.4.4)
1 (1.4.5)
-1 (1.4.6)
0 (1.4.7)
8 (1.4.8)
-8 (1.4.9)
? (1.4.10)
在形式参数的前面加上一个“#”字符作为前缀,将使得实际参数被括在一对双引号里,C语言预处理器会自动将相邻的字符串合并。
(1.4.10) 有些计算机在进行右移操作时不保留操作数的符号位,而且C语言本身也不保证移位操作的结果在数学意义上肯定是正确的。
1.5 关系操作符和条件操作符
优先级:关系( >、<、= ) > 条件 ( A ? B : C)
输出:3 (1.5.1)
2 (1.5.2)
3
3
4 (1.5.3)
4
4
0 (1.5.4)
1 (1.5.5)
1.6 操作符的优先级和条件操作符
短路与(&&)和 短路或(||)
输出:2 1 1 (1.4.1)
2 2 1 (1.4.2)
2 2 2 (1.4.3)
0 -1 0 (1.4.4)
0 -1 0 (1.4.5)
0 0 -1 (1.4.6)
0 -1 -1 (1.4.7)
按照C语言里的有关规则,在按从左到右的顺序对一个逻辑表达式求值的时候,只要知道了它的实际结果,就不会对其余部分求值。(即短路&&(存在一个为FALSE、短路| |(存在一个为(TRUE))
关联规则(即结合性)请看参照附录A
剩下的后续会慢慢更新哟~~
附录
A 运算符优先级
这里所说的“副作用”是指在执行一条本身并无语法错误的语句时会产生的难以确定的后果。C程序的副作用几乎都与变量的值(比如上面这个例子里的递增操作或一个赋值操作的计算结果)无法预料有关。 ↩︎