C++ 中的前缀增量预处理器

发布于 2024-11-10 12:39:40 字数 507 浏览 2 评论 0原文

有人可以解释为什么 b = 150 吗?

#define CUBE(X) ((X) * (X) * (X))

using namespace std;

int main( void )
{
    int a = 3,b = 0;  

    cout << "before "<< endl;
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    cout << endl;
    cout << "after"<< endl;
    b = CUBE( ++a );
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    getchar();
    return 0;
}

Could somebody explain why b = 150 ?

#define CUBE(X) ((X) * (X) * (X))

using namespace std;

int main( void )
{
    int a = 3,b = 0;  

    cout << "before "<< endl;
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    cout << endl;
    cout << "after"<< endl;
    b = CUBE( ++a );
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    getchar();
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

洛阳烟雨空心柳 2024-11-17 12:39:42

因为你使用的是宏。宏不是函数。

行:

b = CUBE( ++a );

被重写为:

b = ((++a) * (++a) * (++a))

在代码编译之前,

代码随后会调用未定义行为,因为您在序列点之间多次递增 a

如果使用函数来代替会更好。

Because you're using a macro. Macros are not functions.

The line:

b = CUBE( ++a );

gets re-written as:

b = ((++a) * (++a) * (++a))

before your code compiles.

The code then invokes Undefined Behaviour because you increment a several times between sequence points.

It would be better if you used a function instead.

你穿错了嫁妆 2024-11-17 12:39:42

(++a) * (++a) * (++a)

(++a) * (++a) * (++a) is undefined behaviour.

污味仙女 2024-11-17 12:39:42

未定义的行为 - 您在序列点之间多次修改 a 。这就是为什么内联函数是极其优越的选择。

Undefined behaviour- you modify a more than once between sequence points. This is why inline functions are the vastly superior option.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文