美文网首页@IT·互联网
#define SQUAKE(a)((a)*(a)) SQU

#define SQUAKE(a)((a)*(a)) SQU

作者: 多啦A梦的百宝袋 | 来源:发表于2017-05-18 14:30 被阅读28次

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

    题目:

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

    相关文章

      网友评论

        本文标题:#define SQUAKE(a)((a)*(a)) SQU

        本文链接:https://www.haomeiwen.com/subject/chksxxtx.html