Way on c & c++ 小记 [四]


关于自增运算符的进一步研究。

代码:

#include<stdio.h>
 
int main(int argc,char*argv[]){
      int a,b;
      a = b = 0;
      b = ++a;
      b = a++;
      b++;
      a = a++;
      return 0;
}


反汇编后:

      b = ++a;
00000039 inc        dword ptr [ebp-0Ch]
0000003c mov        eax,dword ptr [ebp-0Ch]
0000003f mov        dword ptr [ebp-10h],eax
      b = a++;
00000042 mov        eax,dword ptr [ebp-0Ch]
00000045 mov        dword ptr [ebp-10h],eax
00000048 inc        dword ptr [ebp-0Ch]
      b++;
0000004b inc        dword ptr [ebp-10h]
      a = a++;
0000004e nop             
0000004f inc        dword ptr [ebp-0Ch]


2010-1-30

----------------------------------------cuttingline----------------------------------------


C中预处理与typedef概览。

【目录】

1.宏定义

2.文件包含

3.条件编译

4. typedef

 

一、宏定义

预处理命令,包括文件包含和条件编译,都是在预编译时进行处理的;因为编译器无法识别预处理命令,所以在编译前,预处理命令已经处理完毕。预处理命令是ANSI C统一规定的,但是并不是C语言本身的组成,所以纯粹的C编译器是无法识别它们的。

个人总结宏定义有3个用途:

I 简单的宏定义:#define A B

这个比较简单,就是纯粹的完全的替换

II 带参数的宏定义:#define A(a,b) a+b

这点有点类似函数处理,不过函数是在运行时进行调用,而宏定义在编译时便进行替换。前者时间花费在运行上的现场保护等,后者花费在预处理命令上的处理。

例子:

#include <stdio.h>

 

#define Add(a,b) a+b

 

int main(){

int c;

c = Add(2,3);

printf(“%d/n”,c);

return 0;

}

这一段代码输出5并进行换行。

III 得到多个结果的宏

有时候调用函数想返回多个值得使用数组或者指针,使用宏有时候可以简单地“返回”多个值。

例子:

#include <stdio.h>

 

#define LenAndArea(l,s,a,b)l=(a+b)*2;s=a*b;

 

int main(){

int len,area;

LenAndArea(len,area,2,3);

printf(“%d/n%d/n”,len,area);

return 0;

}

这一段输出10换行6换行

 

二、文件包含

C语言第一句一般都是#include<stdio.h>,所以一般久而久之就以为这是C语言的一部分了;然而很惊人的,严格来说这不是C语言本身的组成部分。

文件包含有两种形式,一种是#includestdio.h”,表示要包含的文件从当前目录下搜索,而#include <stdio.h>则表示从存放C库函数头文件的目录搜索,为标准方式。

文件包含在编译预处理时形成一个新的源文件,即将目标文件全部包含进来再进行编译,形成.obj文件,再进行连接。

 

三、条件编译

条件编译给我的第一印象是类似于ThinkPHP的配置文件中设置了‘DEBUG_MODE => TRUE,为什么呢?因为学习条件编译的时候看到的就是用来控制进行跟踪的输出。

例子:

#include <stdio.h>

 

#define DEBUG

 

int main(){

#ifdef DEBUG

printf(“开启了跟踪/n”);

#endif

return 0;

}

当源文件中有多个跟踪输出的时候这样使用方便许多。此外,在避免重复包含头文件时也如此处理。

条件编译格式:

#ifdef A

codehere…

#else

code

#endif

其中#else部分可以省略,只要前文中有#defineA语句,甚至不需要对A进行具体定义标识,便会执行相应代码部分。

类似的有#ifndef

条件编译与if语句不同,条件编译是在编译阶段选择是否进行编译,而if语句是程序运行阶段的控制语句。

最后还有一种条件编译,它根据表达式的值是否为真判断是否进行编译:

#if A

code1

#else

code2

#endif

如果A为真则编译code1,否则编译code2

 

四、Typedef

typedef不是预处理命令,它是在编译时进行处理的。

使用typedef可以利于程序的通用性和可移植性。有的机器上int类型占用2个字节,而有的机器上int类型占用4个字节,此时的int就相当于long类型的数值范围。为了便于移植,可以使用:

typedef int INT

typedef long INT

此外,使用typedef定义数组如下:

#include <stdio.h>

 

typedef int INTARR[10];

 

int main(){

INTARRa={1,2};

printf(“%d/n%d/n”,a[0],a[1]);

return0;

}

2010-2-4

----------------------------------------cuttingline----------------------------------------

 

上一篇:Phonon浅谈


下一篇:如何在 Ubuntu 20.04 上安装 Node.js 和 npm