5.3.1 sizeof 运算符和 size_t 类型

sizeof 的运算对象可以是具体的数据对象 (如变量名) 或类型:

  • 如果是类型, 需要用圆括号括起来

image.png

sizeof 返回 size_t 类型的值:

  • 无符号整数类型

typedef 用于创建类型别名:

  1. typedef double real;
  2. real deal;

%zd 用于打印 size_t 类型, 如果不支持可用 %u, %lu 代替.

5.3.2 求模运算符: %

  • modulus operator
  • 余数 remainder
  • 只能用于整数

image.png

负数求模:

  • 第一个运算对象是正数, 求模结果也是正数; 反之为负数

C99:

image.png

标准规定: 无论何种情况, 只要 a 和 b 都是整数值, 便可通过 a - (a/b)*b 来计算 a%b .

5.3.3 递增运算符: ++

  • increment operator
  • 前缀模式, 后缀模式

image.png

无限循环 infinite loop.

前加, 后加例子:

image.png
image.png

前加, 后加区别:

image.png

应小心使用前加, 后加.

5.3.4 递减运算符: —

  • decrement operator

image.png

  • 关系运算符 relational operator

5.3.5 优先级

优先级很高, 只有圆括号比它们高.

5.3.6 不要自作聪明

自己会糊涂:

  1. while (num < 21 )
  2. {
  3. printf("%10d %10d\n", num, num*num++);
  4. }

编译器可以自行选择先对函数中的哪个参数求值:

  • 无法保证先计算哪部分
  1. ans = num/2 + 5*(1 + num++);
  2. y = n++ + n++;

避免出错:

  • 如果一个变量出现在一个函数的多个参数中, 不要使用前加后加
  • 如果一个变量多次出现在一个表达式中, 不要使用前加后加