关于C语言的问题

请问一下各位一些比较简单的C语言的问题
1.符号常量定义#define PI 3.1415926
与浮点数float PI=3.1415926具体有什么差别啊?希望各位解释得详细一点。

2.
#include<stdio.h>
main()
{
int a;
double x;
a=16;
printf("a1=%d,a2=%d,a3=%d\n",a++,a++,a++);
printf("a1=%d,a2=%d,a3=%d\n",++a,++a,++a);
}
为什么输出的结果是a1=18,a2=17,a3=16,而不是a1=16,a2=17,a3=18?

3.
int a=6,b=4,c;
double x=3.2,y=6.4,z;
c=++a+b%a-3/b%2*a+++b;
z=y--+x*x/y+++y*x;
最后结果C=15,Z=28.480000,为什么?

第1个回答  2009-05-12
1. #define出来的东西不能改它的值
#define出来的东西是预处理的时候替换上去的,所以速度可能会快一点点
浮点常数默认类型好像是double吧,就是说你用float会损失精度
2. 这个问题取决于编译器。 要说解释那就是参数入栈顺序是从右到左的。 但是这个无所谓, 反正写程序不要这样写

3. 跟上一个问题一样, 编译器决定。 关于这两个,C语言标准规定,在两个序列点之间变量只能进行一次赋值。 2,3这两个问题都是违反规定的,所以得到什么结果都别惊讶
第2个回答  2009-05-12
1.float定义的PI是可以修改的(比如重新赋值PI=3.14),define定义的是不可以修改的,这是表现出来的最大区别。实际上计算机系统在实现上有本质的区别,define定义的PI,相当于在编辑器里面进行查找替换所有的PI为对应的值。

2和3不讨论,希望大家写程序不搞这些,建议你们老师不出这样的考试题,不同的编译系统下的结果是不一致的。
第3个回答  2009-05-12
宏定义的符号常存储在常量内存区,运行过程中不能改变其值.
而float PI=3.1415926 是定义一个浮点型的变量,是在栈上分配内存的,而且可以动态地改变其值. 还有应该这样写:float PI=3.1415926f 才正确

printf("a1=%d,a2=%d,a3=%d\n",a++,a++,a++);
输出结果为a1=18,a2=17,a3=16 的原因是由printf含数的设计决定的,该含数首先从右向左计算出各表达式的值,然后在格式化输出,所以你会看到上面的结果.本回答被提问者采纳
第4个回答  2009-05-12
宏定义不能更改值 而你定义的float PI=3.1415926 可以更改PI的值

基本上任何语言的运算都是从右开始的 所以结果是那样没错

同上
相似回答