《重学C++》3. C++的运算符与表达式

1. 利用assert的性质验证德·摩根律。

**assert()**:当且仅当括号内的运算结果为真时,程序可以正常运行;否则程序出错退出。

在开发过程中,经常会用到assert函数进行调试。
例如验证加法函数plus(1,1)返回的函数值是否为预期结果2,可以写成:
assert( plus(1,1) );
如果程序正常运行,说明函数正常。

2. 运算符

有几个运算符比较少见,简单记录一下:

1
2
3
4
5
<<=:左移且赋值运算符。c<<=2等同于c=c<<2
>>=:左移且赋值运算符。c>>=2等同于c=c>>2
&=:按位与且赋值运算符。c&=2等同于c=c&2
|=:按位或且赋值运算符。c|=2等同于c=c|2
^=:按位异或且赋值运算符。c^=2等同于c=c^2

关于移位,一种特殊用法是对2^n取余。

m-(m>>1<<1);  //对2取余
m-(m>>n<<n);  //对2^n取余

这种方法取余要比%取余效率更高,主要用在对性能要求很高的场合。大学一个室友曾在一个实验室呆过,这个实验室主要负责图像处理方向。他们开发用的语言是C,理由是C++速度不够快(python之类就更不用提了),甚至取余都是用这种方法来代替%。

关于运算符:一般来说,一元运算符优先级高于二元运算符

3. 注释的注意事项

  • 好的代码和注释本身就是最好的注释。如果代码很清楚,那么不需要注释;

  • 在重要代码处,最好先写注释再写代码,有利于思路清晰和保证代码注释一致性;

  • 注释不是越多越好,它是对代码的提示,要写就要写清楚,并且需要保持代码和注释的一致性,更新代码也要更新注释。

 



第三章课后练习

一. 填空题(必做)

  1. 下面每行程序输出结果是分别是什么 (涉及知识点: 3-7 sizeof 2-2 数据类型)

    1
    2
    3
    4
    5
    cout sizeof(char)  endl; __1_
    cout sizeof(short) endl; _2__
    cout sizeof(int) endl; _4__
    cout sizeof(float) endl; __4_
    cout sizeof(double) endl; __8_
  2. 下面程序输出结果是分别是什么 (涉及知识点:3-1 算术运算符,3-5赋值运算符, 3-7 sizeof , 逗号运算符)

    1
    2
    a = (x=10,y=20,z=x+y);
    cout<<a<<endl; _30__
  3. 下面程序输出结果是分别是什么 (涉及知识点: 3-7 sizeof, 点运算符 )

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct{
short Sunday = 0;
short Monday = 1;
short Tuesday = 2;
short Wednesday = 3;
short Thursday = 4;
short Friday = 5;
short Saturday = 6;
} Week;
Week w;
cout<<sizeof(w.Sunday)<< endl; _6__
cout<<sizeof(w)<< endl; _14__

结构体大小的计算https://www.runoob.com/w3cnote/struct-size.html

二. 编程题(必做)

  1. 使用#define编写一段代码,来实现“标准”宏MIN?(涉及知识点: 2-6 宏定义 3-3关系运算符 3-7 运算符优先级)

    1
    #define MIN(a,b) ((a)<(b)?(a):(b))

    切记一定要加上括号,因为a、b可能是一个表达式,直接代入a<b?a:b中可能会因为优先级而改变原本意图。

  2. 分别写出bool 、int、 float、与“零值”比较,表达式返回值等于1的代码片段;(涉及知识点: 3-1表达式 3-3关系运算符 3-4 逻辑运算符 2-2 数据类型 )

    1
    2
    3
    4
    5
    6
    7
    bool a = 1;
    int b = 1;
    float c= 1;

    assert(a>0);
    assert(b>0);
    assert(c>0);