情况是这样:在程序的运行中出现了问题,百思不得解,最后把类似 if(a==1||a==2||a==3)的表达式加括号改成了 if (( a==1 )||(a==2)||(a==3))。问题竟然就解决了。谁能解释下
1
geelaw 2017-11-27 11:24:55 +08:00 1
因为你的 a 并不能被这样替换。
你改成 if ((a) == 1 || (a) == 2 || (a) == 3) 也可以解决。 |
2
dychenyi 2017-11-27 11:31:37 +08:00
编译器优化? == || 优先级问题??
|
3
ipwx 2017-11-27 11:34:43 +08:00
a 怕不是宏。。。
|
4
zuoxiaomo 2017-11-27 11:34:50 +08:00
感觉问题还是没有描述清楚
|
5
karia 2017-11-27 11:38:04 +08:00 via Android
别的我不知道,但是用中文括号肯定是不行的🌚
Tip: 熟悉一下 Markdown 可以显著提升 OP 发帖和我们看帖的体验 |
7
acros 2017-11-27 11:40:22 +08:00
a 要是宏的话会被骂的···
万一涉及赋值操作,短路求值造成 bug 还要花时间找。 |
8
congeec 2017-11-27 11:49:47 +08:00
a 是啥类型?
|
10
Zephyros 2017-11-27 13:05:20 +08:00
可能是这个问题:
加个空格,帮助理解 a == 1||a == 2||a == 3 编译器优先执行 1||a,至于 a 和 1||a 是否相等,你得自己用编译器多试几次。 |
11
tengtengking OP @karia 谢谢!
|
12
tengtengking OP @geelaw 没有看懂呢!什么 意思? a 只是一个整形变量
|
13
tengtengking OP @Zephyros 运算符的优先级不是这样的
|
14
tengtengking OP @congeec a 只是一个整形变量
|
15
Zephyros 2017-11-27 13:29:02 +08:00
那么,能否告知你使用的是哪个编译器,在什么系统下运行的,别人好帮你测试
|
16
Zephyros 2017-11-27 13:33:59 +08:00
不妨再试试你的编译器是不是这样处理的:
a == ( 1 || ( a == ( 2 ( || ( a==3 ))))) 有可能是编译器对这两种符号一视同仁。 |
17
Zephyros 2017-11-27 13:35:38 +08:00
这种问题一般 google 一下查查文档就解决了,你要是不说哪个厂的编译器,别人都没法帮你查文档呀。
|
18
bp0 2017-11-27 13:42:04 +08:00
不理解为啥不写成,if ((a > 0) && (a < 4))
|
19
tengtengking OP @Zephyros 多谢回复!编译器是 g++ 4.4.7。
|
20
timynore 2017-11-27 13:53:10 +08:00
有这种事情?
|
21
3dwelcome 2017-11-27 13:56:47 +08:00
看看汇编,单步跟踪一下。我觉得不太可能是编译器问题,一般都是自己代码问题。
|
22
somebody 2017-11-27 13:58:42 +08:00
别简化问题,能把实际的代码贴出来么,保留代码的结构不变,变量名等可以隐去敏感信息
|
23
Zephyros 2017-11-27 14:25:33 +08:00 2
我在 g++ 5.4.0 上帮你测试了,
//g++ 5.4.0 #include <iostream> int func1(int a); int func2(int a); int main() { func1(0); func1(1); func1(2); func1(3); func1(4); func2(0); func2(1); func2(2); func2(3); func2(4); } int func1(int a) { int b = -1; if((a==1)||(a==2)||(a==3)) { b = 1; }else { b = 0; } std::cout << a << " "; std::cout << b << "\n"; return b; } int func2(int a) { int b = -1; if(a==1||a==2||a==3) { b = 1; }else { b = 0; } std::cout << a << " "; std::cout << b << "\n"; return b; } 这两个函数的运行结果都是一样的。你看 a 还要不要取什么别的值测试一下。 肯定有什么因素被你忽略掉了,你还是贴你的代码吧。 |
24
Zephyros 2017-11-27 14:30:22 +08:00
先确定你这一段代码没问题,
然后再考虑是不是多线程资源竞争出了问题,有没有内存泄漏等情况。 |
25
cloverii 2017-11-27 19:19:53 +08:00 via Android
代码贴上来再说话…无代码无真相…
|
26
guangguoguo 2017-11-28 11:34:00 +08:00
== 优先级是 7 , | 是 10, || 是 12, 因此有没有等号都是 应该先运算 ==。应该是你 a 的问题。
|