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