8- C中的枚举类型就是一系列的整型常量。一个枚举类型中,常量对应的整型值可以重复出现。例如下面的程序和运行结果:
$ cat main.c
#include
enum dupl { MALE = 1, FEMALE, MAN = 1 };
int
main() {
enum dupl inst1 = MALE, inst2 = MAN;
printf("%d, %d\n", inst1, inst2);
return 0;
}
$ make run
1, 1
9- 当操作数为负数的时候,整数除'/'和取余'%'运算结果的符号和取整方向,是依赖于运行环境的。
10- C标准定义,一个关系/逻辑表达式,真值为true的时候表达式的值是1,真值为false时表达式的值是0。但在判断条件是否满足时,0被当成false,非0的任何值都被认为是true。例如下面的程序和运行结果:
$ cat main.c
#include
int
main() {
printf("%d, %d, %d\n", 3 > 2, 2 > 3, (3 > 2) + (4 > 3));
printf("%s\n", -2 ? "true" : "false");
return 0;
}
$ make run
1, 0, 2
true
11- C语言中可能造成信息丢失的表达式,如把long赋值给int,有可能引起编译警告,但从合法性角度讲,并不人为是非法代码。
12- C语言没有规定char类型是有符号的整数还是无符号整数。char到int类型的转换中,结果会不会出现负数(即转换过程是“符号扩展”还是补零),是依赖于具体的运行环境的。从可移植性角度考虑,如果要将非字符类型的数据存放在char类型内,最好明确指定是signed char还是unsigned char。
13- 在算术运算中,short和char类型会被自动转换为int,但是float类型不被自动转换为double,除非另外一个操作数也是double类型。
14- double到float的类型转换中是四舍五入还是截断,也是依赖于具体的运行环境的。
15- 函数调用中的参数也是表达式。所以在函数调用传递参数时也会发生类型转换。具体地说,char和short会被转换为int,float会被转换为double。
16- 无符号类型的右移,左边一概补零。带符号类型的右移,是补零还是符号位扩展,依赖于具体的运行环境。
17- (习惯用法):要产生一个bit mask,只有最右边n位是1,用 ~(~0 << n) 。
18- 如果一个?:操作符中,:两边的表达式类型不同,结果的类型是依据算术运算中类型自动转换的规则来决定的。
19- C语言不规定运算操作数被求值的顺序。例如语句
x = f() + g();
如果f()和g()的执行结果和它们被调用的先后次序有关(例如他们依赖于同一个外部变量),那么这个语句就是不安全的。
20- ANSI C中,在任何语句块的开头都可以定义变量。例如下面的程序和运行结果:
$ cat main.c
#include
int
main() {
int i = 0;
if (0 == i) {
int j = 1;
printf("%d, %d\n", i, j);
}
// printf("%d, %d\n", i, j);
return 0;
}
$ make run
0, 1
注意程序中被注释掉的那句话。如果去掉注释,就会出现“j未定义”的编译错误。
阅读(889) | 评论(0) | 转发(0) |