C语言和gcc笔记

本文介绍了C语言中register关键字的作用,数组与指针的关系,字符串常量的合并,编译时宏替换的使用,以及如何在不引入额外变量的情况下交换两个数的值。还探讨了预处理器中的#和##操作符的功能,并给出实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值