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

为什么呢?

6053 次点击
所在节点    程序员
61 条回复
chaoerzheng
2016-03-12 08:33:59 +08:00
我没算结果,写“ d=++a||++b&&++c;”的这个人是垃圾。
ershisi
2016-03-12 08:49:35 +08:00
这个题个人认为是逻辑运算的编译阶段优先级。右侧优先于左侧。另外,这种题做完理解意思就行了。生产环境中你要是这么写代码肯定自己都想骂自己。
chenps10
2016-03-12 09:06:26 +08:00
@ershisi 自己骂不骂自己不知道,技术上司会直接开了他吧。。。这种属于没法教的了
kiwi95
2016-03-12 09:13:48 +08:00
面试如果问这种题,直接拒绝回答就是了
kiwi95
2016-03-12 09:19:57 +08:00
哦,好像看错了,
zwpaper
2016-03-12 09:19:57 +08:00
@ETiV && 优先级不是比 || 高一级吗?
jiangtao92
2016-03-12 10:15:38 +08:00
这个算是逻辑运算吧,不是 true 就是 false !
matthewz
2016-03-12 10:16:10 +08:00
这道题还可以啊 不算是那种++++++a 的傻逼题
wezzard
2016-03-12 11:46:11 +08:00
我會回答:「對不起我不會譚語言編程。」
wezzard
2016-03-12 11:58:02 +08:00
看了看,這道題考的是邏輯運算以及譚語言裏面布爾到底是甚麼。
但是在現代 C 語言編譯器裏面,這段譚語言的代碼編譯是無法通過的,因爲:
1 )我不知道譚語言的標準,但是 C 語言的 main 函數是需要返回 int 類型的值的;
2 )我不知道譚語言的標準,但是 xxx || xxx && xxx 這種寫法在現代 C 語言編譯器的默認警告設定下是會報警的;
raysonx
2016-03-12 12:13:11 +08:00
@wezzard 譚語言,蛤蛤
qian19876025
2016-03-12 12:23:07 +08:00
劝楼主多看看书 其他的都白说 你到现在如何断句都有问题
Testalias
2016-03-12 12:51:42 +08:00
看到 void main 就知道出处了,
出这个面试题的应该不怎么写 C 。
jukka
2016-03-12 12:55:24 +08:00
别在这些东西上浪费生命。
china521
2016-03-12 13:03:35 +08:00
@jukka 同意,如果线上产品写这样的代码,直接会被 fire 的. 也就教科书上用用
Qiangyuan
2016-03-12 15:15:47 +08:00
这题不错,考察程序基本功
donghouhe
2016-03-12 15:19:53 +08:00
学习这种是能加深理解的,还是有点用的。如果你是做不出才愤怒地说没用,那就错了。如果你能轻松做出,那才有资格说。
sagnitude
2016-03-12 15:55:27 +08:00
虽然很多类似的题目毫无意义,但是这道题确实考察了基础
有些题目纠结于++符号,是毫无意义的,碰到那种代码,我会在代码规范里加上“类似情况必须加括号”
这道题说的是赋值符号,和语言基本无关,楼上几位结论下太快的可以再看几眼题目
JJFJJ
2016-03-12 16:02:27 +08:00
写这样的代码,在 CodeReview 和以后维护的时候,会被人骂死的。
为什么不加括号来解决优先级的问题呢
syhilyhw
2016-03-12 16:10:54 +08:00
这个你只能怪+++++

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

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

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

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

© 2021 V2EX