• 小心!#define max(a,b) a>b?a:b


    今天做oj的时候,定义了两个宏:

    //wrong code
    #define
    max_2(a,b) a>b?a:b #define max_3(a,b,c) (a>b?a:b)>c?(a>b?a:b):c

    然后程序结果总是WA,仔仔细细检查程序的逻辑一遍又一遍,都快抓狂了,最后终于发现是我定义的两个宏有问题。改为如下就AC了:

    #define max_2(a,b) (a>b?a:b)
    #define max_3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)

    对的,就是差两个括号,没有括号,因为优先级不一样,造成运算顺序并不是我们预期的那样,运算结果错误。

    下边是分析过程:

    先上两段有问题的代码:

    #include <iostream>
    #define max_2(x,y) x>y?x:y
    using namespace std;
    
    int main()
    {
        int a=max_2(1,2)+3;
        int b=max_2(2,1)+3;
        int c=max_2(1,2);
        int d=max_2(2,1);
        int e=(max_2(2,1)+3);
        cout<<a<<" "<<b<<endl;
        cout<<c<<" "<<d<<endl;
        cout<<e<<endl;
        
        return 0;
    }

    运行结果:

    从程序中变量c、d可以发现,max_2(x,y)里不论x、y的顺序如何,max_2(x,y)能够返回正确的结果;

    从程序中变量a、b可以发现,运算顺序跟max_2(x,y)里x、y的顺序有关,当x>y时,程序先将max_2(2,1)的结果赋给b,而不是加3之后再赋给b;

    从程序中变量e可以发现,即使加了括号,也不能改变这种运算顺序。

    另一段问题代码,如下图,编译都不能通过:

    所以,不要忘了关键的括号,不然害人不浅。

  • 相关阅读:
    IOS开发C语言入门如何结合Terminal和Vim开发C语言程序
    如何开发原生的 JavaScript 插件(知识点+写法)
    IOS开发数据持久化篇之文件存储(一)
    PC 端微信扫码注册和登录
    2020最全面的微服务
    RabbitMQ详解
    MongoDB基础篇&集群篇
    从原理上理解MySQL的优化建议
    分布式日志搜集ELK
    MySQL高级篇性能优化
  • 原文地址:https://www.cnblogs.com/duanguyuan/p/3283044.html
Copyright © 2020-2023  润新知