不可思议的 C++问题

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

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

3467 次点击
所在节点    程序员
26 条回复
3dwelcome
2017-11-27 13:56:47 +08:00
看看汇编,单步跟踪一下。我觉得不太可能是编译器问题,一般都是自己代码问题。
somebody
2017-11-27 13:58:42 +08:00
别简化问题,能把实际的代码贴出来么,保留代码的结构不变,变量名等可以隐去敏感信息
Zephyros
2017-11-27 14:25:33 +08:00
我在 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 还要不要取什么别的值测试一下。

肯定有什么因素被你忽略掉了,你还是贴你的代码吧。
Zephyros
2017-11-27 14:30:22 +08:00
先确定你这一段代码没问题,
然后再考虑是不是多线程资源竞争出了问题,有没有内存泄漏等情况。
cloverii
2017-11-27 19:19:53 +08:00
代码贴上来再说话…无代码无真相…
guangguoguo
2017-11-28 11:34:00 +08:00
== 优先级是 7 , | 是 10, || 是 12, 因此有没有等号都是 应该先运算 ==。应该是你 a 的问题。

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

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

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

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

© 2021 V2EX