为什么这段 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 。

为什么呢?

5842 次点击
所在节点    程序员
61 条回复
stackpop
2016-03-11 23:22:27 +08:00
运算符优先级
c0nnax
2016-03-11 23:22:31 +08:00
前面那个是逻辑吧
raysonx
2016-03-11 23:23:04 +08:00
||是邏輯運算符,返回結果只可能是 1 或 0 。
ll0xff
2016-03-11 23:23:44 +08:00
因为 (++a||++b&&++c )实际是个 boolean 值。
KyL
2016-03-11 23:25:15 +08:00
好吧,我明白了。
`d=++a||++b&&++c;`的执行顺序应该是
`d=((++a)||((++b)&&(++c)))`
++a = 2 直接就决定了 d="true",也就是 d=1
ben3ai
2016-03-11 23:27:24 +08:00
这个表达式中=运算符的优先级是最低的,=右边, and 优先级高于 or ,++a 为 true ,编译器应该是把逻辑真作 1 处理了
ETiV
2016-03-11 23:30:04 +08:00
因为 "||", "&&" 被理解成了判断 true / false

并且, 从左到右, 先遇到了 ||, 所以只要 || 左边的结果 !=0 , 就直接返回了 true.
后面的 ++b, ++c 都没有被运算到...你自己试试看吧..
airqj
2016-03-11 23:32:07 +08:00
实际上只会算(++a)
wenyu1001
2016-03-11 23:36:36 +08:00
出现这样的代码, code review 时定会被骂,幸好只是面试题。
r00t
2016-03-11 23:42:10 +08:00
我发现某些公司总是喜欢出这种面试题~优先级看好就 ok
oplang
2016-03-11 23:47:10 +08:00
8 楼说的对,算完(++a)就直接把值赋给等号左边了,没后面什么事
neilp
2016-03-11 23:55:52 +08:00
不要跟 js 搞混了
theohateonion
2016-03-12 02:02:45 +08:00
。。个人强烈反对去研究这种代码,感觉一点意义都没有。。这种代码的出现本身就是一个错误,无数的小白因为这些东西把编程看作洪水猛兽,其实真正的编程真的很美不是吗。
Ge4Los
2016-03-12 02:24:21 +08:00
1. 逻辑运算符的 || 优先级高于赋值运算符 =。
2. || 运算符的短路特性。|| 前面条件为真, 后面的条件是不需要继续运算。
3. C 中布尔值真为 1 。
这题涉及的内容属于 C 专有的特性。
shiji
2016-03-12 02:38:32 +08:00
@theohateonion 同强烈反对,这就像小学的奥数题,费时,麻烦,并且将来没什么卵用。 也许只会在面试这种环节出现吧,一辈子再也遇不到了。
Valyrian
2016-03-12 02:45:21 +08:00
@shiji 小学奥数很开拓思维好吗
arslion
2016-03-12 02:55:40 +08:00
sensui7
2016-03-12 03:56:58 +08:00
@shiji 是一辈子根本都不会写这种代码, 这种反人类的代码, 除了能装比没有任何好处。
yangqi
2016-03-12 05:00:03 +08:00
运算符优先级,最基本的东西,能看出一个人的基本功
shiji
2016-03-12 05:08:02 +08:00
@Valyrian 是挺好玩的,但是拿来一道题几乎没人能会做,反正我学的奥数几乎都是针对每一种题型,记忆住解题的规律,然后这一类题就都会了。等哪一天忘了那个规律或者是公式,脑子里就啥也不剩了。

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

https://www.v2ex.com/t/262900

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

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

© 2021 V2EX