C语言:已有声明int x=5,y;float z=2;,则下列表达式正确的是

A:y=x%z
B:x>0?y=x:y=-x
C.y=x/2=z
D.y=x=z/2
我觉得每个都对啊,为什么只有D是对的?

我对你题目及问题分析下,不对之处还清指出:
A:是求余,所以Z不能是小数,虽然z貌似是等于2,但是在定义的时候z是float内容,编译器会议float的存储方式储存,所以属于小数。
B:正确格式为:x > 0 ? (y = x):(y = -x);
C:从左至右开始计算,y = x / 2 再 x/2 = z;后面的部分出错了,x/2 = 2,2 = z,好像是对的,不过常量不能作为左值,所以错误。
D:就不说了,你都知道D是对的了。追问

谭浩强书上103页有个例子是a>b?a:b+1相当于a>b?a:(b+1),这样的话我觉得B是不需要括号的。赋值号是自右向左开始计算的,按你这么说,D不是也应该是错的吗

追答

你好!首先我来回答你的第一个疑问,这涉及到C语言运算符的优先级的问题,在:和+号中:的优先级比+号高,所以先运行判断,再进行选择,而=和:的符号优先级是=比:高,当经历?号的判断后,由于=比:优先级高,所以得运行=的运算,这就产生了一个编译器能识别的错误,所以会报错。
现在来回答第二个疑问,赋值号也就是=号,是将右边的值赋给左边,C中X/2是2,是一个数值,然后就相当于y = 2 = z;2右怎么能被赋值z呢?再次你所说到的D的问题,相当于 y = x = 1;说的明白一点就是,=号左边得一定是一个存储空间,而右边可以是一个存储空间内容,也可以是一个数值,这样,=运算就是将右边的数值写入=左边得存储空间里面,答案c中2 = z,是给一个数值赋值,D的话,你都知道他是对的就不说了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-11
A x%z的意思是x除以z所得的余数,所以x、z必须是整数
B 运算顺序有问题y=x与y=-x应加括号
C 不符合规范
D
第2个回答  2013-09-11
A . z不能是小数2.0
B . y=-x 等价于y=y-x 。y是多少呢,还不知道。
C . =左边是变量 不能是这种x/2 .追问

=左边要求是变量的话,D选项x=z/2也不对啊

追答

哦。不好意思。D 可以分这么两补 。x=z/2; y=x; 这是等价的。= 运算符是从左到右的顺序也就是右结合性。

追问

B分析错了吧,另外对于C和D来说,不管是x/2=z,还是x=z/2,左值都是个常量,应该都是错的才对

追答

等候左边.x不是常量.是int类型的变量.
x/2也不是常量,是表达式.
还希望你可以搞清楚常量,变量,表达式.

C语言:已有声明int x=5,y;float z=2;,则下列表达式正确的是_百度...
A:是求余,所以Z不能是小数,虽然z貌似是等于2,但是在定义的时候z是float内容,编译器会议float的存储方式储存,所以属于小数。B:正确格式为:x > 0 ? (y = x):(y = -x);C:从左至右开始计算,y = x / 2 再 x/2 = z;后面的部分出错了,x/2 = 2...

已有声明”int x=15,y;float z=12;",下列表达式中语法正确的是()A...
首先看答案a,%用在了整数和浮点数之间,这个是不合理的,在运算的时候,两个数类型不一样,编译器会将小范围的自动提高到大范围,相当于将x变成浮点再计算求模,显然不对。再看c和d,这两个共同的问题就是赋值语句的左边不是变量

已有声明“int a[5];”,以下表达式不能正确取得a[1]地址的是 A &a...
C:因为数组每个元素是INT,所以第个元素占有两个字节的单元,所以在地址上加1,则是指向同一个元素 D:A+1就是指下一个元素的意思

c语言作业
C. 指向整型变量的指针 D. 指向数组的指针 C语言规定,若未对函数返回类型加以说明,则函数的隐含类型为(B)A. char B. int C. void D. double 已有定义char a[] = "xyz", b[]={ 'x', 'y', 'z' } 以下叙述正确的是 c a. 数组a 的存储空间长度小于数组b 的存储空间长度 b. ...

...的表示中正确的是()。A.int &x=m;B.int &y=10;C.int &am
【答案】:A 解析:引用比较特殊,即必须指向一个已有的同类型变量。引用是已有变量的别名,故选项C是错误的,选项 D中变量类型不同,而选项B中是常数。

设已有定义:float x;,则下列对指针变量 p 进行定义且赋初值的语句中正确...
正确答案选择D,“float *p=&x;”,因为x是一个float型的变量,所以说要定义一个float型的指针变量来存储x变量的地址,所以说选项D直接排除。然后C选项也可以排除,因为C选项定义的是变量,不是指针变量。A和D选项都是指针变量,但是A选项不能作为正确的语句,不能把一个常数赋值给指针变量,所以说A...

已有声明“int x,a=3,b=2;”,则执行赋值语句“x=a>b++?a++:b++...
该赋值语句可以写成这样 if(a>b++)\/\/a大于b++ 执行完成后b=3;{ x = a++;\/\/a++后a的值为4 赋值语句自右向左x为3 } else { x = b++;\/\/不执行 } 因此x,a,b为3,4,3.

设已有声明“int x[]={1,2,3,4,5,6},*p=&x[2];”,则值为3的表达式是...
选择B int *p=&x[2]表示p是一个指向x[2]地址单元的指针,就*p=x[2]=3.所以你要找的是哪一个表达式的意思是:*p.B中 先取值,然后p再++,即输出3,然后p指向&x[3].

有哪位知道这些C语言关键字怎么发音?分别代表什么意思?
C语言的关键字有数十个,例如:int、float、char、void、if、else、while、for、return、struct、union、typedef等。这些关键字在C语言中扮演着不同角色。1. int:表示整数变量类型。当你声明一个整数变量时,如 int a;,意味着a是一个整数型变量。2. float:表示浮点数变量类型。用于存储有小数部分...

C语言题库,求发一份
5. 若已有声明“int x1; float x2; long x3; char x4;”,且以下选项均出现在switch语句中,其中正确 的是(5) 。 A. case 1.1: scanf("%d",&x1);break; B. case 1+2: scanf("%f",&x2); break; C. case 'x': case 'y'-1: scanf("%ld",&x3); break; D. case x4: scanf("%c"...

相似回答