V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tengtengking
V2EX  ›  程序员

不可思议的 C++问题

  •  
  •   tengtengking · 2017-11-27 11:16:17 +08:00 · 3357 次点击
    这是一个创建于 2313 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2017-11-27 13:13:47 +08:00
    a 只是一个普通的整形变量,并不是宏。
    26 条回复    2017-11-28 11:34:00 +08:00
    geelaw
        1
    geelaw  
       2017-11-27 11:24:55 +08:00   ❤️ 1
    因为你的 a 并不能被这样替换。

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

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

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

    有可能是编译器对这两种符号一视同仁。
    Zephyros
        17
    Zephyros  
       2017-11-27 13:35:38 +08:00
    这种问题一般 google 一下查查文档就解决了,你要是不说哪个厂的编译器,别人都没法帮你查文档呀。
    bp0
        18
    bp0  
       2017-11-27 13:42:04 +08:00
    不理解为啥不写成,if ((a > 0) && (a < 4))
    tengtengking
        19
    tengtengking  
    OP
       2017-11-27 13:52:29 +08:00
    @Zephyros 多谢回复!编译器是 g++ 4.4.7。
    timynore
        20
    timynore  
       2017-11-27 13:53:10 +08:00
    有这种事情?
    3dwelcome
        21
    3dwelcome  
       2017-11-27 13:56:47 +08:00
    看看汇编,单步跟踪一下。我觉得不太可能是编译器问题,一般都是自己代码问题。
    somebody
        22
    somebody  
       2017-11-27 13:58:42 +08:00
    别简化问题,能把实际的代码贴出来么,保留代码的结构不变,变量名等可以隐去敏感信息
    Zephyros
        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 还要不要取什么别的值测试一下。

    肯定有什么因素被你忽略掉了,你还是贴你的代码吧。
    Zephyros
        24
    Zephyros  
       2017-11-27 14:30:22 +08:00
    先确定你这一段代码没问题,
    然后再考虑是不是多线程资源竞争出了问题,有没有内存泄漏等情况。
    cloverii
        25
    cloverii  
       2017-11-27 19:19:53 +08:00 via Android
    代码贴上来再说话…无代码无真相…
    guangguoguo
        26
    guangguoguo  
       2017-11-28 11:34:00 +08:00
    == 优先级是 7 , | 是 10, || 是 12, 因此有没有等号都是 应该先运算 ==。应该是你 a 的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.