Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335272
  • 博文数量: 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-23 11:24:07

21- 逗号运算符分隔的各个子表达式,求值顺序是有规定的:从左到右依次求值。为了交换两个变量的值,下面的语句是正确无误的:
temp=a, a=b, b=temp;
 
 
22- goto语句的后面的标签必须和goto位于同一个函数内。goto得跳转范围不能超过其所在函数。
 
 
23- 如果说明函数的时候没有说明返回值类型,缺省被认为是int。不管是否为一个函数说明了返回值类型,函数中的return语句后面都可以没有返回值,甚至可以没有return语句。
在程序中使用了函数的返回值,但函数本身并没有return语句或者return语句后面没有值,这并不是语法错误,但此时函数的返回值是未定义的“垃圾”值。
例如下面的程序和运行结果:
$ cat main.c
#include
dummy() {
  return;
}
dummy2() {
  int i = 10;
}
int
main() {
  printf("%d\n", dummy());
  printf("%d\n", dummy2());
  return 0;
}
$ make run
0
2
可见:第一,dummy()没有声明返回值类型却仍然可以引用其返回值。第二,即使dummy2()根本没有return语句,也可以引用其返回值。从dummy2()的值可以更明显地看出,返回值是不确定的“垃圾”值。上面的程序在gcc 3.2下编译没有错误或警告。
 
 
24- 如果一个表达式中出现了一个尚未被定义的名字,并且其后紧跟一个左括号"(",那么它将被编译器(1)由上下文推断为一个函数名,(2)假定其返回值类型为int,(3)不对其参数列表做任何假定。
函数声明还可以和变量定义一起进行,例如
int
main() {
  double d, atof(char *);
  return 0;
}
就声名了一个名为atof的函数,返回值类型为double。
 
 
25- C不允许在函数内嵌套定义其他函数,因此C的函数都是external的。
 
 
26- 一个外部变量/函数的作用域,是从声明它的那一点开始到该文件的末尾。如果一个外部变量在定义前被引用,或者在一个文件中定义而在另外一个文件中被引用,那么extern声明就是必须的。
 
 
27- 一个变量的定义做了两件事:(1)为该变量分配内存;(2)在该文件中定义点到文件末尾之间,起到声明该变量的作用。
 
 
28- 如果某文件中定义了一个extern变量,在同一个文件中可以出现对该变量的extern声明。例如:
$ cat main.c
#include
int glob;
extern int glob;
int
main() {
  extern int glob;
  return 0;
}
在gcc 3.2下编译没有错误或警告。
 
 
29- 对外部变量,如果是数组类型,定义点必须提供数组长度,声明的时候数组的长度是可选的。例如下面的声明是合法的:
extern double val[];
 
 
30- static修饰符将一个外部变量/函数的可见范围限制到定义它的文件,其他文件中这些变量/函数是不可见的。
 
 
31- register修饰符可以用于自动变量和函数的形式参数说明。注意只要用了register修饰符,对该变量取地址的操作就是被禁止的,不管事实上该变量是否被放入了寄存器。例如:
$ cat main.c
#include
int
fun(register int arg) {
  register int i;
  int *pi = &i;
  int *pa = &arg;
  return 0;
}
int
main() {
  fun(0);
  return 0;
}
$ make
gcc -g main.c
main.c: In function `fun':
main.c:6: warning: address of register variable `i' requested
main.c:7: warning: address of register variable `arg' requested
 
 
32- 可以在任何语句块的开头声明变量。这种变量的生存期,到该语句块末尾的"}"为止。每次进入到这样的语句块的时候这些变量都会被初始化。例如
if (a < 0) {
  int n = 2;
  ...
}
 
 
33- C保证extern和static变量被缺省初始化为0,如果提供初始化表达式,那么初始化表达式必须是一个常量表达式。automatic和register变量的缺省初始值是未定义的,如果提供初始化表达式,不限于常量表达式,还可以引用之前定义了的变量甚至调用函数。
 
 
34- 数组初始化如果提供的初始值个数少于数组长度,没有初始值的元素会被初始化为0,注意这一点不单对extern, static成立,对自动变量也成立的。例如下面的程序中数组arr的全部元素初始值保证为0:
$ cat main.c
#include
int
fun(void) {
  int arr[9] = {0};
  return 0;
}
int
main() {
  fun();
  return 0;
}
 
 
35- 以下两个语句等价:
char pattern = "ould";
char pattern[] = {'o', 'u', 'l', 'd', '\0'};
阅读(859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~