本节书摘来自异步社区出版社《C和C++程序员面试秘笈》一书中的第1章,第1.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 = 12
x = 2
x = 1
x = 2
x = 1
x = 6
x = 1
x = 5
x = 3`