1. 变量
变量类型
|
初始化时机
|
默认初始化值
|
初始化值限制
|
automatic
|
进入块时
|
无
|
任意expression
|
external
|
程序执行前
|
0
|
任意const expression
|
static
|
程序执行前
|
0
|
任意const expression
|
a) const 可在all三种变量之前。
b) 当const修饰数组时,代表数组元素不可变;当修饰指针时,代表被指内容不可变。
注意: const int * a / int const *a(常量指针,被指内容不可变);int *const a(指针常量,a本身不可变)
2. 除法运算规则
a) C89及之前:负数除法的结果不确定,与上溢下溢结果相同
b) C99,C++0X及之后
(1)m/n向0方向取整
(2)m%n = m - (m/n)*n
注意:5%(-3) 不同于 (-5)%3
3. 常量字符
a) 'm'
b) '\m'
c) '\0mn' //1. m和n是八进制数字0-7;2. 向右填充,即'\0m' = '\00m' (gcc实验结果,不确定是否是C语法规范)
d) '\xmn' // 十六进制,其余同上
4. 类型转换
a) 通用规则:在一个表达式中出现多种类型时,表示范围小的转为表示范围大,可以保证不丢失精度,即还能转回来,但转换结果有时不保证(参见a1,a2)。如果不存在最大范围类型(其他都是其子集),则结果不确定(例如unsign int 与 int)。
a1
) char/short -> int 如果char的首位为1,那么int的符号就不确定(有的机器取其作为符号位,然后把整个char中内容(含首位1)作为数字值;而有的机器则均为正)。能打印出的char首位一定为0,但不能打印的char则最好使用时指明(un)signed。首先尝试转为int,放不下的话就转为unsigned int,称为integer promotion。
a2) double -> float 结果是截取还是轮转,不确定。
b) 函数调用时参数转换:当被调函数未声明(no prototype)时,会生成一个默认的声明,并将按此声明准备实参,short/char实参会转为int实参,float实参会转为double实参。如下图
注意:函数实参,默认会强制类型转换,所以调用时无需手动强制转换。
阅读(346) | 评论(0) | 转发(0) |