《C语言解惑》—— 3.4 注意编译系统的差别

简介:

本节书摘来自华章出版社《C语言解惑》一 书中的第3章,第3.4节,作者:刘振安 刘燕君,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 注意编译系统的差别

【例3.7】程序的运行结果取决于编译系统的例子。

#include  <stdio.h>
void main()
{
      int a=65135;
      double i=8256.67;
      a=(int)i+a;
      printf("\n%d,%f",a,i);
}

如果使用VC,输出结果为“73391,8256.670000”。如果使用Borland C++,则输出为“7855,8256.670000”。这是因为前者为int分配4个字节;后者为int分配2个字节,结果a=-401,变成了8256-401=7855。如果将声明改为
long a=65135;
对VC来说,并没有影响。但对Borland C++来说,虽然计算结果对了,但输出函数printf的参数不匹配,仍然得不到正确结果。如果将它改为格式
printf("n%ld,%f",a,i);
则Borland C++也能得到正确结果。
由此可见,编程时还要考虑自己的使用环境,不能生搬硬套。
写程序时,也要注意不同编译系统的区别。
【例3.8】运行结果取决于编译系统的例子。

#include <stdio.h>
void main()
{
     int m=5;
     printf("\n%d,%d",m,m++);
}

这个程序使用m的方式会产生歧义。因为在调用函数时,C标准并没有规定实参数的求值顺序。m和m++是两个表达式的值。VC是自左而右求值,先使用m,然后自增1,所以输出是“5,5”;Borland C++是自右而左求值,第一个m为5,但它使用之后变为6,将6作为第二个m值,所以输出是“6,5”。
在编程时,应避免使用可能产生歧义的语句,更不要写别人看不懂,也不知道系统如何执行的程序。尤其是使用“++”和“--”时,更要小心。

相关文章
|
1月前
|
监控 网络协议 API
C语言系统编程
C语言系统编程
|
1月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
1月前
|
存储 Linux C语言
Linux系统下C语言的构造数据类型
Linux系统下C语言的构造数据类型
12 0
|
1月前
|
Linux C语言 开发者
Linux系统下C语言的高阶编程
Linux系统下C语言的高阶编程
15 0
|
1月前
|
Linux C语言
Linux系统下C语言的队列操作
Linux系统下C语言的队列操作
23 0
|
1月前
|
存储 自然语言处理 编译器
C语言从入门到实战——编译和链接
在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编译过程包括以下步骤: 1. 预处理:将源代码中的预处理指令(如`#include`和`#define`)替换为实际的代码。 2. 编译:将预处理后的代码转换为汇编语言。 3. 汇编:将汇编语言转换为机器码指令。 链接过程包括以下步骤: 1. 目标文件生成:将每个源文件编译后生成的目标文件(`.o`或`.obj`)进行合并,生成一个总的目标文件。 2. 符号解析:查找并解析目标文件中的所有符号(例如全局变量和函数名),以确保每个符号都有一个唯一的地址。 3. 地址重定位:根据符号表中符号的地址信息,将目标文件中的所有地址引用
41 0
|
1月前
|
编译器 程序员 开发工具
c语言从入门到实战——在系统学习C语言之前所需要了解的知识
C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言的基本构成包括数据类型(如整型、浮点型、字符型等)、运算符(如算术运算符、关系运算符、逻辑运算符等)、控制结构(如顺序结构、选择结构、循环结构等)以及函数等。此外,C语言还提供了指针的概念,这是其他许多编程语言所不具备的。指针是一个变量,其值为另一个变量的地址,通过指针可以间接访问和操作内存中的数据。C语言也支持数组、结构体、联合体等复合数据类型,以及文件操作、动态内存分配等高级功能。
51 0
|
1月前
|
机器学习/深度学习 人工智能 算法
21.C语言:if语句编译选择结构举例
21.C语言:if语句编译选择结构举例
13 0
|
1月前
|
编译器 Linux C语言
c语言结构体知识系统详解
c语言结构体知识系统详解
49 0
|
1月前
|
存储 Linux C语言
Linux系统下C语言的文件操作
Linux系统下C语言的文件操作
17 0