谜题1.2 赋值操作符
请问,下面这个程序的输出是什么?
#define PRINTX printf("%d\n",x)
main()
{
int x = 2, y, z;
x *= 3 + 2; PRINTX; (1.2.1)
x *= y = z = 4; PRINTX; (1.2.2)
x = y == z; PRINTX; (1.2.3)
x == ( y = z ); PRINTX; (1.2.4)
}

输出:
10 (1.2.1)
40 (1.2.2)
1 (1.2.3)
1 (1.2.4)

解惑1.2 赋值操作符
1.2.1
|
初始值:x=2 |
|
|
x *= 3 + 2 |
按照操作符的优先级和关联规则进行绑定。 |
|
x *= (3 + 2) |
正如我们刚才看到的那样,赋值操作符的优先级低于算术操作符(“*=”是一个赋值操作符)。 |
|
(x *= (3 + 2)) |
|
|
(x *= 5) |
求值。 |
|
(x = x*5) |
把赋值操作扩展为它的等价形式。 |
|
(x = 10) |
关于define:本谜题的程序以
#define PRINTX printf("%d\n", x)
这条语句开头。在C程序里,以“#”字符开头的代码行都是一条C预处理器语句。预处理器的工作之一是把一个记号字符串替换为另一个。这个程序里的define语句,告诉预处理器把代码里的“PRINTX”记号全部替换为字符串“printf("%d\n", x)”。
1.2.2
|
初始值:x=10 |
|
|
x *= y = z = 4 |
|
|
x *= y = (z = 4) |
在这个表达式里,所有的操作符都是赋值,所以绑定顺序将由关联规则决定。赋值操作符的关联规则是从右到左。 |
|
x *= (y = (z = 4)) |
|
|
(x *= (y = 4)) |
求值。 |
1.2.3
|
初始值:y=4,z=4 |
|
|
x = y == z |
|
|
x = (y == z) |
“=”(赋值)与“==”(是否相等)之间的区别经常让一些C语言的初学者感到困惑。根据C语言的操作符优先级表,“==”操作符的优先级要高于“=”操作符。 |
|
(x = (y == z)) |
|
|
(x = 1) |
关系操作符和相等操作符的结果要么是TRUE(用整数值1表示)要么是FALSE(用整数值0表示)。 |
|
1 |
1.2.4
|
初始值:x=1,z=4 |
|
|
x == (y = z) |
|
|
(x == (y = z)) |
在这个表达式里,因为使用了括号,所以赋值操作将优先于相等比较。 |
|
(x == 4) |
求值。 |
|
FALSE,即0 |
这个表达式的求值结果是0。但因为变量x的值没有发生变化(“==”操作符不改变其操作数的值),所以PRINTX语句仍将输出1。 |






