【问题标题】:Macro and Pre/Post Increment in C [duplicate]C中的宏和前后增量[重复]
【发布时间】:2017-04-30 03:24:26
【问题描述】:

我在使用预增量运算符时注意到宏函数的这种奇怪行为。我知道将预增量运算符与宏一起使用并不可取,但我仍然想知道执行以下 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。

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

【问题讨论】:

标签: c macros post-increment pre-increment


【解决方案1】:

宏是文本替换,所以你的代码

 SQR(a++)

扩展到类似的东西

 a++ * a++

还有,int c=SQR(++a);int c = ++a*++a;

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

【讨论】:

  • 没有任何方法可以得到至少第一个函数的答案,因为这是我在一次考试中得到的结果
  • @user7297996 不,UB 是...UB。就是这样。
  • 好的,谢谢你的帮助
  • 如果这是考试题,要么你的老师在欺骗你,答案是“未定义的行为”,要么你的老师不知道他们在做什么,也没有商业教学 C. (我会接受的另一个答案是,“我不知道,但如果你写过这样的代码,你应该被踢,所以这并不重要。”)
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 2012-06-01
  • 2015-12-21
  • 2015-05-21
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多