Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329399
  • 博文数量: 79
  • 博客积分: 2466
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-07 16:47
文章分类

全部博文(79)

文章存档

2014年(3)

2012年(7)

2011年(14)

2010年(2)

2009年(2)

2008年(2)

2007年(18)

2006年(31)

分类: C/C++

2006-02-20 11:37:41

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未定义”的编译错误。
阅读(848) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~