不可思议的 C++问题

2017-11-27 11:16:17 +08:00
 tengtengking

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

3372 次点击
所在节点    程序员
26 条回复
geelaw
2017-11-27 11:24:55 +08:00
因为你的 a 并不能被这样替换。

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

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

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

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

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

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

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

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

© 2021 V2EX