C语言赋值表达式问题:若定义有语句:int a=3, b=2, c=1; 以下选项

若定义有语句:int a=3, b=2, c=1; 以下选项中错误表达式是()
a)a=(b=4)=3;
b)a=(b=4)+c;
c)a=b=c+1;
d)1+(b=c=4);

A为什么错?
谭浩强书中(a=3*5)=4*3又为什么对?

测试代码:
#include "stdio.h"
#include "conio.h"

main()
{
int a=3, b=2, c=1;
a=(b=4)=3;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a=(b=4)+c;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a=b=c+1;
printf("a=%d,b=%d,c=%d\n",a,b,c);
1+(b=c=4);
printf("a=%d,b=%d,c=%d\n",a,b,c);
(a=3*5)=4*3;
printf("a=%d,b=%d,c=%d\n",a,b,c);
getch();
}

测试平台:
【Dev_C++】 顺利通过
结果:
a=3,b=3,c=1
a=5,b=4,c=1
a=2,b=2,c=1
a=2,b=4,c=4
a=12,b=4,c=4

【TC2.0测试】
a=(b=4)=3;
(a=3*5)=4*3;
2句话有语法错误!

这个怎么说呢?其实就是赋值等号从右往左看就可以了。主要的原因是【C的标准和编译器】的实现不同吧。C89,99,11都有很多变化。而且不同的编译器对一些处理是不同的。
比如一个函数的多个参数含有表达式的话,是从左往左呢还是从右往左计算都有差异的。
如:int fun1(int a,int b,int c)
调用的时候:fun1(i++,++i,i++) 不同的编译器有不同处理。

再说大一点:不同的语言对同一功能也是不同的。
就说求模函数。 C,Java,Javascript ,VB,C#,C++,PHP,Go等在负数求余的时候选择的处理是不一样的。-7.2%-3.8 -7.8%-3.2,-7.8%-3.8,-7.2%-3.2 楼主可以好好测试和琢磨下。

总结:这种题目总的来说就考试无厘头的试题了。实际项目和开发中我们也会老老实实在分成多条语句来写。考试的时候楼主就不要纠结了。
选A吧。不能将常量3赋值给一个表达式(非变量),b=4已经是个表达式了,既然是表达式就只有真假(即True和False)
楼主还记得这样的考题吗:

int a=3, b=2, c=1;
if(b=3)
{
printf("True");
}
else
{
printf("False");
}

所以本题,考试就选A!
楼主好运!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-10
赋值语句的对象只能是变量,而不是表达式 b=4已经是个表达式。若换成a=b=3,就对了。
对于B,最后的值:a=2,b=2,c=1
对于C,整个语句是个赋值语句,里面又嵌套了个b=4的赋值语句,所以,最后的结果是a=5,b=4,c=1
对于D,解法同C,a=5,b=4,c=4.
所以A 是错误滴。追问

谭浩强书中(a=3*5)=4*3又为什么是对?

而且我带入vc中A答案可以运行通过。

这还是真题,疯了。

第2个回答  2012-04-10
A错了,不能将3赋值给表达式,b=4已经是个表达式了,既然是表达式就只有真假(即0和1),

而 (a=3*5)=4*3 中的a=3*5 是赋值
第3个回答  2012-04-10
我在vc++6.0中粘贴你的代码,编译运行都通过
#include <stdio.h>
int main()
{
int a=3, b=2, c=1;
a=(b=4)=3;
a=(b=4)+c;
a=b=c+1;
1+(b=c=4);
printf("%d %d %d\n",a,b,c);
return 0;
}
结果2 4 4
相似回答