您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
c语言预处理器的输出、常用的算术转换
发布时间:2021-04-20 21:07:28编辑:雪饮阅读()
预处理的输出
预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include 指令之后的文本输出。
如,您有一个头文件 header.h:
char *test (void);
和一个使用了头文件的主程序 program.c,如下:
int x;
#include "header.h"
int main (void)
{
puts (test ());
}
编译器会看到如下的代码信息:
int x;
char *test (void);
int main (void)
{
puts (test ());
}
在这里已经生成的输出:
int x;
在这里被引用文件生成的输出:
char *test (void);
在这里 #include 指令之后的文本输出:
int main (void)
{
puts (test ());
}
有条件引用
有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不同的操作系统上使用的配置参数。您可以通过一系列条件来实现这点,如下:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
但是如果头文件比较多的时候,这么做是很不妥当的,预处理器使用宏来定义头文件的名称。这就是所谓的有条件引用。它不是用头文件的名称作为 #include 的直接参数,您只需要使用宏名称代替即可:
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H 会扩展,预处理器会查找 system_1.h,就像 #include 最初编写的那样。SYSTEM_H 可通过 -D 选项被您的 Makefile 定义。
其实关于这个头文件比较多的时候我个人还是觉得第一个处理方法比较好。
毕竟第一个一次性兼容了多个不同的系统,而第二个处理方法,需要在每次在不同的系统中进行编译时候要对Makefile中通过-D选项进行定义的
SYSTEM_H进行修改
那么从编译的方便程度,肯定是第一个处理方法比较好了
常用的算术转换
常用的算术转换是隐式地把值强制转换为相同的类型。编译器首先执行整数提升,如果操作数类型不同,则它们会被转换为下列层次中出现的最高层次的类型:
算术转换不适用于赋值运算符、逻辑运算符 && 和 ||
正常:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = i + c;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 116.000000
错误:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = i/c;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 0.000000
对:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = (double)i/c;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 0.171717
对:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = (float)i/c;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 0.171717
对:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = (float)c/i;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 5.823529
错误:
#include <stdio.h>
int main()
{
int i = 17;
char c = 'c'; /* ascii 值是 99 */
float sum;
sum = c/i;
printf("Value of sum : %f\n", sum );
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Value of sum : 5.000000
错误原因:
i/c操作隐式地把值强制转换为相同的类型,这里进行了整数提升,但是17/99的值是浮点数,由于常用的算术转换不适用于赋值运算符
所以结果仍旧以int接收,那么0.171717就仅保留了整数部分(非四舍五入)
c/i则和i/c的错误原因是同样的
关键字词:c语言,预处理器的输出,常用的算术转换