#define PRINT(int) printf("%d/n", int) main() { int x, y, z; x = 2; y = 1; z = 0; x = x && y || z; PRINT(x); PRINT(x || !y && z); x = y = 1; z = x++ - 1; PRINT(x); PRINT(z); z += - x ++ + ++y; PRINT(x); PRINT(z); z = x / ++ x; PRINT(z); }
对于
x = x && y || z;
x || !y && z;
z = x++ - 1;
z += - x ++ + ++y;
以上这些只要考虑到操作符的优化级和关联规则,还有以前提到过的贪心法(大嘴法)就可以得出结果了。同贪心法的知识,请参考:C语言陷阱与缺陷之词法分析中的“贪心法”。
我们重点研究一下z = x / ++x这个语句。
(z = (x / (++ x)))
如果你还像以前那样按照从内到外的顺序对这个表达式进行求值,即先对x进行递增,然后作为除数、用x作被除数去进行除法计算。问题是:作为被除数的x到底是几?是3还是4?换个问法,被除数到底是递增前的x值,还是递增后的x值?请注意,C语言并没有对这种“副作用”作出明确的规定,而是由C编译器的编写者决定的。这个例子的教训是:如果你无法断定会不会产生副作用,那么就尽量不要写这样的表达式。
未经允许不得转载:TacuLee » C语言解惑之逻辑操作符和增量操作符