单选题
1、第125题 (1.0分) 题号:603 以下符合C语言语法的赋值表达式是()。
A
d=9+e+f=d+9
B
d=9+e,f=d+9
C
d=9+e,e++,d+9
D
d=9+e++=d+7
答案解析
正确答案:B
解析:
**正确答案:B**
**解析:**
本题考查 C 语言中**赋值表达式**、**逗号表达式**以及**左值(lvalue)**的概念。我们需要逐一分析各个选项是否符合 C 语言的语法规则。
1. **分析选项 A:`d=9+e+f=d+9`**
* 在 C 语言中,赋值运算符 `=` 是右结合的。该表达式会被解析为 `d = (9 + e + f = d + 9)`。
* 关键在于子表达式 `9 + e + f = d + 9`。赋值运算符的左边必须是一个**可修改的左值**(即一个变量或内存地址)。
* 然而,`9 + e + f` 是一个算术表达式的结果(一个临时值,即右值),它不是左值,不能被赋值。
* 因此,该表达式语法错误。
2. **分析选项 B:`d=9+e,f=d+9`**
* 这是一个**逗号表达式**。逗号运算符 `,` 的优先级最低,低于赋值运算符 `=`。
* 因此,该表达式等价于 `(d = 9 + e), (f = d + 9)`。
* 第一部分 `d = 9 + e`:将 `9+e` 的值赋给变量 `d`,`d` 是左值,语法正确。
* 第二部分 `f = d + 9`:将 `d+9` 的值赋给变量 `f`,`f` 是左值,语法正确。
* 整个表达式由两个合法的赋值表达式通过逗号连接而成,符合 C 语言语法。
* 因此,该选项正确。
3. **分析选项 C:`d=9+e,e++,d+9`**
* 这也是一个逗号表达式,包含三个子表达式:`d=9+e`、`e++`、`d+9`。
* 虽然这三个子表达式各自在语法上都是合法的(`d+9` 只是一个计算表达式,虽然没有副作用,但语法上是允许的),但题目问的是“符合 C 语言语法的**赋值表达式**”。
* 严格来说,逗号表达式的类型和值由最后一个子表达式决定。这里最后一个子表达式是 `d+9`,它是一个算术表达式,而不是赋值表达式。
* 更重要的是,在单选题中,通常考察的是最典型的结构。选项 B 明确包含了两个赋值操作,且整体结构清晰。而在某些语境下,如果题目严格要求整个表达式的最终结果或主要性质是“赋值”,C 选项的最后一部分 `d+9` 并非赋值。
* *注:其实 C 选项在语法上也是合法的 C 语言表达式(Expression),但它不是一个“赋值表达式”(Assignment Expression),因为逗号表达式的结果是 `d+9` 的值,且整个式子没有以赋值结束。相比之下,B 选项虽然也是逗号表达式,但通常这类题目中 B 被视为更典型的合法语句结构。不过,最关键的排除理由通常是看是否有语法错误。让我们重新审视题目的提问方式:“符合C语言语法的赋值表达式”。*
* **更正与深入辨析**:实际上,C 语言标准中,“赋值表达式”是指由赋值运算符构成的表达式。逗号表达式属于“逗号表达式”。但是,通常在考试题中,“赋值表达式”有时被宽泛地理解为“包含赋值操作的合法表达式”或者题目意在找出**没有语法错误**的选项。
* 让我们再看 D 选项来对比。
4. **分析选项 D:`d=9+e++=d+7`**
* 同样涉及赋值运算符的结合性。解析为 `d = (9 + e++ = d + 7)`。
* 子表达式 `9 + e++ = d + 7` 中,左边是 `9 + e++`。
* `e++` 的结果是右值(旧值),加上 9 后仍然是右值。
* 右值不能作为赋值运算符的左操作数。
* 因此,该表达式语法错误。
**总结对比 B 和 C:**
* **选项 B** `d=9+e,f=d+9` 是一个逗号表达式,其中包含了两个合法的赋值子表达式。
* **选项 C** `d=9+e,e++,d+9` 也是一个合法的逗号表达式。
* 为什么选 B 不选 C?
* 很多教材或考题将 `表达式1, 表达式2` 这种形式归类为逗号表达式,而如果题目问的是“赋值表达式”,可能存在歧义。
* 但是,如果我们仔细看选项 B,它由两个**赋值表达式**组成。
* 如果我们看选项 C,最后一部分 `d+9` 仅仅是算术表达式。
* 在某些严格的定义中,只有形如 `变量 = 表达式` 的才叫赋值表达式。那么 A、B、C、D 四个选项整体上都含有逗号或复杂结构,都不是单一的赋值表达式。
* **通常这类题目的考点在于识别“语法错误”**。
* A 错:左值非法。
* D 错:左值非法。
* 剩下 B 和 C 都是语法正确的表达式。
* 但是,再仔细检查选项 C:`d=9+e, e++, d+9`。虽然语法没错,但作为一道选择题,往往 B 选项这种 `d=..., f=...` 的形式更符合“对变量进行赋值”的常规逻辑考察。
* **另一种常见的考点解释**:有些旧题库或特定教材认为,逗号表达式不属于“赋值表达式”范畴,但如果必须选一个,B 选项中的每个部分都是赋值,而 C 的最后部分不是。或者,题目可能隐含意思是“哪一个是合法的**语句**或**表达式**”,此时 B 和 C 都合法。
* **关键区别**:让我们再次检查 A 和 D 的错误是非常明显的(左值问题)。在 B 和 C 之间,B 选项 `d=9+e,f=d+9` 经常被用作展示逗号运算符优先级的经典例子。而 C 选项 `d+9` 放在最后没有任何实际作用(无副作用),虽然语法合法,但在工程或考试逻辑中,B 往往是预期答案,因为它展示了连续赋值的合法性。
* **此外**,还有一种可能性:题目问的是“赋值表达式”,在 C 语言文法中,`Assignment Expression` 是 `Conditional Expression` 的一种,而 `Comma Expression` 是单独的。如果严格按文法,四个选项都不是单纯的 Assignment Expression。但通常这类题目是把“包含赋值运算的合法表达式”统称为赋值表达式相关题目。
* **最终判定依据**:A 和 D 有严重的语法错误(Lvalue required)。B 和 C 语法均正确。但在计算机二级等考试真题库中,此题的标准答案通常为 **B**。这可能是因为 B 选项完整地体现了“赋值”这一行为在逗号表达式中的正确应用,而 C 选项末尾的 `d+9` 容易被误判或被认为“非赋值性质”。也有可能是题目印刷或录入时,C 选项原本设计有误(例如原题可能是 `d=9+e=e++` 之类),但在当前文本下,B 是最稳妥的正确选项,因为它清晰地展示了两个正确的赋值操作。
综上所述,A 和 D 因赋值号左侧不是左值而错误;B 是合法的逗号表达式,包含两个合法的赋值操作;C 虽语法合法,但相比 B,B 更贴合“赋值”的主题且是此类经典题目的标准答案。
故正确答案为 **B**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第134题 (1.0分) 题号:143 C语言中以下几种运算符的优先次序()的排列是正确的。
单选题
1、第133题 (1.0分) 题号:170 关于return语句,下列正确的说法是()。
单选题
1、第132题 (1.0分) 题号:128若int类型数据占两个字节,则下列语句的输出为()。int k=-1; printf(”%d,%u\n”,k,k);
单选题
1、第131题 (1.0分) 题号:705 若有语句int *point,a=4;和 point=&a;下面均代表地址的一组选项是()。
单选题
1、第130题 (1.0分) 题号:167 下列语句中,不正确的是()。
单选题
1、第129题 (1.0分) 题号:651 以下定义语句中,错误的是()。
单选题
1、第128题 (1.0分) 题号:125 下列程序的输出结果是()。
单选题
1、第127题 (1.0分) 题号:639 以下能正确定义数组并正确赋初值的语句是()。
单选题
1、第126题 (1.0分) 题号:689 以下叙述中不正确的是()。
单选题
1、第125题 (1.0分) 题号:603 以下符合C语言语法的赋值表达式是()。
