zoukankan      html  css  js  c++  java
  • const和define的差别

    1、const有什么用途?
    (1)可以定义const常量
    (2)const可以修饰函数的参数和返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防以外的变动,能提高程序的健壮性。

    int main()
    {
        const int j=42;
        const int k;//错误,未初始化
        extern const int j=100;//const对象被设定为仅在文件内有效,要在文件外使用,需要利用extern
        j+=1;//错误,j不能改变
    
        int i=2;
        int &r1=i;
        const int &r2=i;
        r1=0;
        r2=1;//错误,r2是一个常量引用
        cout<<i<<' '<<r1<<' '<<r2<<endl;//0 0 0,r1、r2绑定i,但是r2不能改变i的值。
        return 0;
    }

    2、const和define有什么差别?
    C++可以用const定义常量,也可以用#define定义常量,但前者比后者有更多的优点:
    (1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。
    (2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不是用宏常量,即const常量完全取代宏常量。

    宏定义:

    #include <iostream>
    #include <cstdio>
    
    #define SQR_1(x) (x*x);
    #define SQR_2(x) ((x)*(x))
    
    using namespace std;
    int main()
    {
        int a,b,c,d;
        b=d=3;
        a=SQR_1(b+2);
        cout<<a<<endl;
        c=SQR_2(d+2);
        cout<<c<<endl;
        return 0;
    }

    宏定义展开时容易造成二义性问题。a=SQR_1(b+2)展开后为b+2*b+2=11,c=SQR(d+2)展开后为(d+2)*(d+2)=25

  • 相关阅读:
    表达式计算
    atof和atoi
    十六进制与十进制之间的相互转换
    十六进制转八进制
    B. Blown Garland
    B. Arpa’s obvious problem and Mehrdad’s terrible solution
    ios::sync_with_stdio(false);
    1091 线段的重叠
    CODE[VS] 2614 安全区域
    CODE[VS] 2221 搬雕像 ——2011年台湾高级中学咨询学科能力竞赛
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9201157.html
Copyright © 2011-2022 走看看