《C语言解惑》一1.2 赋值操作符

    xiaoxiao2024-07-15  94

    本节书摘来自异步社区《C语言解惑》一书中的第1章,第1.2节,作者 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看

    谜题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 赋值操作符

    1.2.1

    初始值: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)”。

    1.2.2

    初始值:x=10

    x *= y = z = 4

    x *= y = (z = 4)   在这个表达式里,所有的操作符都是赋值,所以绑定顺序将由关联规则决定。赋值操作符的关联规则是从右到左。

    x *= (y = (z = 4))

    (x *= (y = (z = 4)))

    (x *= (y = 4))  求值。

    (x *= 4)

    40

    1.2.3

    初始值:y = 4, z = 4

    x = y == z

    x = (y == z)   “=”(赋值)与“==”(是否相等)之间的区别经常让一些C语言的初学者感到困惑。根据C语言的操作符优先级表,“==”操作符的优先级要高于“=”操作符。

    (x = (y == z))

    (x = (TRUE))

    (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。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)