本节书摘来自异步社区出版社《C和C++程序员面试秘笈》一书中的第1章,第1.1节,作者: 董山海,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C和C++程序员面试秘笈考点: 一般赋值语句的概念和方法
出现频率:
#include <stdio.h> int main(void) { int x = 3, y, z; x *= (y = z = 4); printf("x = %d\n", x); z = 2; x = (y = z); printf("x = %d\n", x); x = (y == z); printf("x = %d\n", x); x = (y & z); printf("x = %d\n", x); x = (y && z); printf("x = %d\n", x); y = 4; x = (y | z); printf("x = %d\n", x); x = (y || z); printf("x = %d\n", x); x = (y == z)? 4: 5; printf("x = %d\n", x); x = (y == z)? 1: (y < z)? 2: 3; printf("x = %d\n", x); return 0; }``` 【解析】 程序的说明如下: 程序执行至第8行时,x的值为3,y和z未被初始化。此行的执行顺序是首先执行z=4,然后执行y=z,最后执行x=y。因此x的值为34=12。 程序执行至第10行时,z的值为2。此行的执行顺序是首先执行y=z,然后执行x=y。因此x的值为2。 程序执行至第11行时,y和z的值都为2。此行的执行顺序是首先执行y==z,比较y和z的值是否相等,然后将比较的结果赋给x。因此x的值为1。 程序执行至第12行时,y和z的值都为2。此行把y和z做按位与(&)运算的结果赋给变量x。y和z的二进制都是10,因此y & z 的结果为二进制10。因此x的值为2。 程序执行至第13行时,y和z的值都为2。此行把y和z做逻辑与(&&)运算的结果赋给变量x。此时y和z的值都不是0,因此y && z 的结果为1。因此x的值为1。 程序执行至第16行时,y的值为4,z的值为2。此行把y和z做按位或(|)运算的结果赋给变量x。此时y和z的二进制表示分别为100和010,因此y|z的结果为110。因此x的值为110,十进制表示为6。 程序执行至第17行时,y的值为4,z的值为2。此行把y和z做逻辑或(||)运算的结果赋给变量x。此时y和z的值都不是0,因此y||z的结果为1。因此x的值为1。 程序执行至第19行时,y的值为4,z的值为2。此行首先比较y和z的大小是否相等,如果相等,则将x取4和5的前者,否则x取4和5的后者。在这里,y不等于z,因此x的值为5。 程序执行至第22行时,y的值为4,z的值为2。此行首先比较y和z大小是否相等,如果相等,x取1,否则,判断y是否大于z,如果是,则取2,否则取3。在这里,y的值大于z的值,因此x的值为3。 总结:这个考题只是考查各种基本的赋值运算。这里,读者要注意位运算与逻辑运算的区别,以及三元操作符的用法。通过程序代码17行以及19行的举例,我们可以发现三元操作符有时可以代替条件判断if/else/else if的组合。 【答案】x = 12x = 2x = 1x = 2x = 1x = 6x = 1x = 5x = 3`
相关资源:C和C 程序员面试秘笈