#define SQUAKE(a)((a)*(a)) SQUAKE(a++) SQUAKE(++a)

写在前面的话:最近看到一道关于带参数的宏定义题目。网上答案虽多,但却千篇一律,并且有理解偏颇。现在写来提供需要的人阅读。

题目:

#include <stdio.h>
#define SQUAKE(a)((a)*(a))
int main(int argc, const char * argv[]) {
    int a=5;
    int b;
    b = SQUAKE(a++);
    printf("=======:%d\n",b);
    return 0;
}
// b=25  b=30
#include <stdio.h>
#define SQUAKE(a)((a)*(a))
int main(int argc, const char * argv[]) {
    int a=5;
    int b;
    b = SQUAKE(++a);
    printf("=======:%d\n",b);
    return 0;
}
//  b=42 b=49

A1C1CDF0-579E-4156-B946-8BB98BE60B8E.png

注意:前方高能

b = SQUAKE(a++);
就等于
b=(a++)(a++)
递增了两次。
由于
标准并未对这类运算规定顺序以下结果都有可能
(a++)
(a++)=56=25
(a++)
(a++)=5*6=30

b = SQUAKE(++a);
就等于
b=(++a)(++a)
递增了两次,一次在乘法之前,一次在乘法之后。
(a++)
(a++)=67=42
(a++)
(a++)=7*7=49

9AF666F2-E562-4228-9B13-35D8B015885C.png

如果还是不太清楚,参考《C Primer Plus++》第527页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容