为什么这个操作不遵循C中的优先级和结合表? [重复]

问题描述 投票:0回答:1

我试图了解函数和带有参数的宏之间的区别(又名“宏函数”?),我得到了这个代码:

#include <stdio.h>

#define mult_m(a) a*a 

int mult_f(int a){
    return a*a;
}

int main()
{
    int x=3,y=3,z=3;
    //printf("%d\n",mult_m(x++));
    //printf("%d\n",mult_f(++y));
    printf("%d\n",++z * z++);
    printf("%d\n",z);

    return 0;
}

输出为:20

我知道优先级和关联性,这个输出对我来说没有意义,在我的头脑中这应该是:

  • 后缀增量的优先级高于 * 或前缀 ++,因此: ++z * 3++ ---> ++z * 3(z 现在等于 4)---> ++4 * 3

  • * 和前缀 ++ 具有相同的优先级,因此结合性是从右到左的,因此: ++4 * 3 ---> 5*3=15

头炮输出:15

实际产量:20

你能解释一下为什么会发生这种情况吗?如果您有 C 标准参考来解释这一点,我将非常感激

提前致谢!

c operator-precedence associativity
1个回答
0
投票

你能解释一下为什么会发生这种情况吗?

是的,因为当您对变量进行无序修改时,它会调用未定义的行为

z

如果您启用警告,编译器会警告您

<source>:23:19: warning: operation on 'z' may be undefined [-Wsequence-point]
© www.soinside.com 2019 - 2024. All rights reserved.