c - C 中的宏和前/后增量

标签 c macros post-increment pre-increment

<分区>

我在使用预增量运算符时注意到宏函数的这种奇怪行为。我知道将预增量运算符与宏一起使用并不可取,但我仍然想知道执行以下 2 个代码背后的原因:

#include <stdio.h>

#define SQR(x) {x*x }

int main()
{
    int a=4;
    int b=SQR(a++);
    int c=SQR(++a);
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0;
}

这个的输出是:

20.....64....10240

第一个值b是20,4*5还行。但为什么 C 的值为 64,即 8*8 而不是 7*8?

我只是像这样替换了执行顺序:

#include <stdio.h>

#define SQR(x) {x*x }

int main()
{
    int a=4;
    int c=SQR(++a);
    int b=SQR(a++);
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0;
}

这个的输出是:

42.....36....12096

是不是很奇怪?预增量再次出现问题。它给出了 42,即 6*7 而不是 5*6,之后后增量也给出了错误答案 36,即 6*6 而不是 6*7。

如果有人能解释为什么输出是这样的,那将是一个很大的帮助?

最佳答案

宏是文本替换,因此您的代码

 SQR(a++)

扩展成类似的东西

 a++ * a++

并且,int c=SQR(++a);int c =++a*++a;

调用 undefined behavior .要对此详细说明为什么部分,请参阅这个写得很好的答案。

关于c - C 中的宏和前/后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41148678/

相关文章:

c - 输入 'Q' 时退出循环

objective-c - 编译时 Objective-C 类名的宏,如 __PRETTY FUNCTION__

rust - 基于宏规则生成元组索引!重复扩展

ios - ios 自定义框架中的宏定义不起作用

c++ - 进一步了解 i++ 和 i=i+1

c - 为什么表达式 a==--a true 在 if 语句中?

c - 预处理器不同的函数名称相同的功能

c++ - 我可以在没有 C++ 的情况下学习 Win32 API(仅使用 C)吗?

c - 创建链表时出现段错误

c++ - 左值和右值分配错误