面试题求详解:int c9 cc++%5 最后求c等于多少?附答案求详解今天面试碰到这样一个题, 有些不明白,请大
面试题求详解:int c=9; c=c++%5; 最后求c等于多少?附答案求详解
今天面试碰到这样一个题, 有些不明白,请大家帮忙解释
面试原题
读程序段,回答问题
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 写出程序输出
b) 在一个可移植的系统中这种表达式是否存在风险?why?
HR给出的答案是
1.程序输出为: 5
2.存在风险,因为: 因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定
我的疑惑:
我回家用eclipse 运行上面的代码 无论编译,运行多少遍 结果只有一个: 4 。 而不是 5 !!!
还有源码中开始不是有一行 int c = 9; ? 这个不是给 c指定了 类型是9 赋值为 9 么, 为什么却说行尾未定义???
请大家帮忙详细解答一下,谢谢了
[解决办法]是“
行为未定义”,不是“
行尾未定义”。。。
对于下面这句话的解释:
c=c++%5;
一些编译器会这么解读:
c%5 //是4
c=(c%5) //是4
c++ //变成5了
但是eclipse是这么解读的:
c%5 //是4
(c++) //作为一个表达式,这里c先被自增为5,但是表达式的结果还是4。
c=4; //把表达式再赋值给c,结果c又变回4咯~
所以在可移植系统中,代码千万不能写的太随便。
[解决办法]类型是9 赋值为 9
类型是int...
c = c++ % 5;
c是9,c % 5 = 4, 将4赋给c(第一次赋值), 再c++(第二次赋值),c就等于5了...
第一次赋值 和 第二次赋值 到底哪次先执行,是不确定的,
如果第二次赋值先执行的话,
c是9, c % 5 = 4, 将c++, c = 10; 再将4赋给c, c就等于4了..
[解决办法]c=9 => c=c%5=4 => c++ (c=5),可能面试官是这么觉得,具体++跟c=c%5哪个先执行跟编译器有关
不过这种面试题也是真2,
[解决办法]2.存在风险,因为: 因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定
lz都这么说了,呵呵,你的编译器给出的结果如果都不唯一的话,你肯定会哭。。。。。
未定义行为,是标准没给与定义,但不代表编译器的行为未定义,呵呵。每种编译器给出的行为规则肯定是一致的,不然。所有人都会哭了
[解决办法]我的思维得到的也是5,
不过我也不会写c=c++%5这样的表达式,总觉得可能会因为编译器不同而得到不同的答案,
但是c=d++这样的表达式我敢写。
其实连c=d++%5我都不敢写~~
[解决办法]应该跟编译器有关,编译的时候,有些编译器把“c++”放到给c赋值之前,有些放到给c赋值之后。
PS:个人感觉这个面试官水平还不行