为什么这段 C 代码结果是 1?

2016-03-11 23:16:29 +08:00
 KyL

看到这么一道面试题

#include <stdio.h>
void main()
{
   int a=1,b=0,c=-1,d=0;
   d=++a||++b&&++c;
   printf("d=%d", d); //output 1;
   return;
}

我不理解为什么 d 会变成 1 而不是 2 。我知道所谓“短路”,但是无论如何,最左边 d=++a 这个表达式都会被 evaluate 啊。

#include <stdio.h>
void main()
{
   int a=1,b=0,c=-1,d=0;
   d=++a;
   printf("d=%d", d); //output 2
   return;
}

这个结果就得 2 。

为什么呢?

6136 次点击
所在节点    程序员
61 条回复
yuchting
2016-03-13 14:50:29 +08:00
4 年多没碰 C 了,不过看了一下,感觉等号右边是个 bool 式,那么赋值不是 1 就是 0 ,到不了其他情况去的吧?这个是编译器干的,再高级一点的语言,编译器直接报错的。

出这个题的目的应该是判断“++”在左边或右边的情况,以及条件运算符从左到右的依次判断及运算舍弃的期基础知识。不要吐槽了。实际编程不会写成这样的,但是实际情况中的 bug 都是因为这个关系没有理清楚而导致的所谓的低级错误。

有些戏低级错误找起来巨麻烦, 3 年重压下找到后只想自杀,后悔当年没学好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/262900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX