1.C语言中的register关键字只是类型修饰符和const和volatile的地位一样。在C语言中定义register a;用gcc -Wall 编译后会警告type defaults to `int' in declaration of `a',可见register 只是修饰符。
2.在C语言中数组会退化为指针。如下代码
#include <stdio.h>
#include <string.h>
int main(){
int i;
int a[10];
memset((void *)a,0,sizeof(a));
5[a] = 5;
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
printf("\n");
}
编译运行后结果为 0 0 0 0 0 5 0 0 0 0
这也就是说5[a] = 5; 这个语句和a[5]=5;效果是一样的。这是为什么呢?答案是数组退化为指针a[5] = *(a+5)根据加法交换律*(a+5)=*(5+a)=5[a]。
3.在C语言中会将相邻的字符串常量合并为一个。如:"Hello" "World"会在编译时合并为"HelloWorld"。
4.在编译程序时可以在得到编译代码的时间,这要用到编译系统定义的宏__DATE__(日期)和__TIME__(时间)。如:
#include <stdio.h>
int main(){
printf("Compiled in" __DATE__" "__TIME__);
}
gcc -E test.c -o test.i
test.i:
int main(){
printf("Compiled in" "Apr 9 2013"" ""22:25:09");
}
可以看到__DATE__和__TIME__被替换成了编译时的时间了。
相似的__FILE__ 所在的文件名 __LINE__引用语句所在行。注意__LINE__并不是字符串常量,在预编译后__LINE__被替换成整型常量。
5.在使用C/C++编译器时,编译器会预定义一些符号。gcc编译器可以很容易获得预定义的符号。
touch
gcc -dM -E a.c -o a.i
a.i文件的内容就是gcc预定义的宏了。
6.在不引入第三个变量的情况下交换两个变量的值(位运算的经典案例):
variable a,b;
a = a^b;
b = a^b;
a = a^b;
此时a与b的值都交换了。
7.C语言中#的作用:
1.表示宏定义命令,如#include,#define,#if,#endif
2.在有参数的宏定义中,#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.。
#define S1(a) #a
#define S2(a) "a"
#define C(a,b) a##b
#include <stdio.h>
int main(){
int ab = 100;
printf("%s %s\n",S1(12),S2(34));
printf("%d\n",C(12,15));
printf("%d\n",C(a,b));
}
运行结果如下:
12 a
1215
100