不可思议的 C++问题

2017 年 11 月 27 日
 tengtengking

情况是这样:在程序的运行中出现了问题,百思不得解,最后把类似 if(a==1||a==2||a==3)的表达式加括号改成了 if (( a==1 )||(a==2)||(a==3))。问题竟然就解决了。谁能解释下

3780 次点击
所在节点    程序员
26 条回复
geelaw
2017 年 11 月 27 日
因为你的 a 并不能被这样替换。

你改成 if ((a) == 1 || (a) == 2 || (a) == 3) 也可以解决。
dychenyi
2017 年 11 月 27 日
编译器优化? == || 优先级问题??
ipwx
2017 年 11 月 27 日
a 怕不是宏。。。
zuoxiaomo
2017 年 11 月 27 日
感觉问题还是没有描述清楚
karia
2017 年 11 月 27 日
别的我不知道,但是用中文括号肯定是不行的🌚

Tip: 熟悉一下 Markdown 可以显著提升 OP 发帖和我们看帖的体验
Cooky
2017 年 11 月 27 日
@ipwx 很有可能…
acros
2017 年 11 月 27 日
a 要是宏的话会被骂的···
万一涉及赋值操作,短路求值造成 bug 还要花时间找。
congeec
2017 年 11 月 27 日
a 是啥类型?
bramblex
2017 年 11 月 27 日
@acros

感觉就是宏造成的优先级问题
Zephyros
2017 年 11 月 27 日
可能是这个问题:
加个空格,帮助理解 a == 1||a == 2||a == 3
编译器优先执行 1||a,至于 a 和 1||a 是否相等,你得自己用编译器多试几次。
tengtengking
2017 年 11 月 27 日
@karia 谢谢!
tengtengking
2017 年 11 月 27 日
@geelaw 没有看懂呢!什么 意思? a 只是一个整形变量
tengtengking
2017 年 11 月 27 日
@Zephyros 运算符的优先级不是这样的
tengtengking
2017 年 11 月 27 日
@congeec a 只是一个整形变量
Zephyros
2017 年 11 月 27 日
那么,能否告知你使用的是哪个编译器,在什么系统下运行的,别人好帮你测试
Zephyros
2017 年 11 月 27 日
不妨再试试你的编译器是不是这样处理的:
a == ( 1 || ( a == ( 2 ( || ( a==3 )))))

有可能是编译器对这两种符号一视同仁。
Zephyros
2017 年 11 月 27 日
这种问题一般 google 一下查查文档就解决了,你要是不说哪个厂的编译器,别人都没法帮你查文档呀。
bp0
2017 年 11 月 27 日
不理解为啥不写成,if ((a > 0) && (a < 4))
tengtengking
2017 年 11 月 27 日
@Zephyros 多谢回复!编译器是 g++ 4.4.7。
timynore
2017 年 11 月 27 日
有这种事情?

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

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

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

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

© 2021 V2EX