首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

谜题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)
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 = (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。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论