【问题标题】:Macro anomaly in c++/g++ [duplicate]c ++ / g ++中的宏异常[重复]
【发布时间】:2016-02-01 07:44:48
【问题描述】:

下面的代码应该返回值 216 但它返回 392 即 (7*7*8) 。有人可以解释一下吗?

#include<iostream>
#define cube(x) (x*x*x)
    using namespace std;

    int main()
     {
        int x=5;
        cout<<cube(++x);
        cout<<endl;
        return 0;
      } 

【问题讨论】:

    标签: c++ macros g++ pre-increment


    【解决方案1】:

    您应该真正使用函数而不是宏。 cube(++x) 扩展为

    ++x*++x*++x
    

    这根本不是我们想要的。

    【讨论】:

    • 感谢您的建议。我不是想用这个来解决问题。我只是对这种行为感到好奇。问题是如果 x 被 x++ 替换,那么它不应该是 7*8*9 吗??
    • 可能是 any 结果。不允许在表达式中多次更改变量的值。如果你这样做,就像这里一样,语言标准并没有说明会发生什么。所以我们不知道。
    【解决方案2】:

    宏展开后会得到:

    using namespace std;
    
    int main()
     {
        int x=5;
        cout<<(++x*++x*++x);
        cout<<endl;
        return 0;
      }
    

    这是未定义的行为。

    只需使用函数而不是 cube 宏:

    int cube(int x) {
       return x * x * x;
    }
    

    【讨论】:

    • 感谢您的建议。我不是想用这个来解决问题。我只是对这种行为感到好奇。问题是如果 x 被 x++ 替换,那么它不应该是 7*8*9 吗??
    • @xeon 这就是未定义行为出现的部分。你不能指望这个程序有任何特定的结果。
    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多