2016-12-14 72 views
0

我已经注意到使用预增加运算符时宏函数的这种奇怪的行为。我知道这是不是最好使用预增运算符与宏,但我仍想知道以下两个代码的执行背后的原因:C中的宏和前/后增量

#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。

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

+0

未定义的行为 – Danh

+0

这不是一个很重复的http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior因为OP可能会混淆宏是什么(假设Sourav Ghosh的回答)。 –

+0

嗨@Danh居然在我的一次考试中提出了这个问题,因此我认为应该有一些方法来得到答案。 – user7297996

回答

2

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

SQR(a++) 

扩展到像

a++ * a++ 

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

它调用undefined behavior。为了详细说明为什么这部分,请参考这个写得很好的答案。

+0

是否有任何方法得到至少第一个功能的答案,因为这是我在我的一个考试中得到 – user7297996

+1

@ user7297996 nopes,UB是... UB。而已。 –

+0

好的,谢谢你的帮助 – user7297996