5.3.1 sizeof 运算符和 size_t 类型
sizeof 的运算对象可以是具体的数据对象 (如变量名) 或类型:
- 如果是类型, 需要用圆括号括起来
sizeof 返回 size_t 类型的值:
- 无符号整数类型
typedef 用于创建类型别名:
typedef double real;
real deal;
%zd 用于打印 size_t 类型, 如果不支持可用 %u, %lu 代替.
5.3.2 求模运算符: %
- modulus operator
- 余数 remainder
- 只能用于整数
负数求模:
- 第一个运算对象是正数, 求模结果也是正数; 反之为负数
C99:
标准规定: 无论何种情况, 只要 a 和 b 都是整数值, 便可通过 a - (a/b)*b
来计算 a%b
.
5.3.3 递增运算符: ++
- increment operator
- 前缀模式, 后缀模式
无限循环 infinite loop.
前加, 后加例子:
前加, 后加区别:
应小心使用前加, 后加.
5.3.4 递减运算符: —
- decrement operator
- 关系运算符 relational operator
5.3.5 优先级
优先级很高, 只有圆括号比它们高.
5.3.6 不要自作聪明
自己会糊涂:
while (num < 21 )
{
printf("%10d %10d\n", num, num*num++);
}
编译器可以自行选择先对函数中的哪个参数求值:
- 无法保证先计算哪部分
ans = num/2 + 5*(1 + num++);
y = n++ + n++;
避免出错:
- 如果一个变量出现在一个函数的多个参数中, 不要使用前加后加
- 如果一个变量多次出现在一个表达式中, 不要使用前加后加