单选题
1、第193题 (1.0分) 题号:120 假设所有变量均为整型,表达式:a=2,b=5,a>b?a++:b++,a+b的值 是()。
A
7
B
8
C
9
D
2
答案解析
正确答案:B
解析:
这是一道关于 C 语言中**逗号表达式**、**三元运算符**以及**自增运算符**优先级的经典题目。
### 1. 题目分析
表达式为:`a=2, b=5, a>b ? a++ : b++, a+b`
我们需要逐步拆解这个表达式的执行过程。在 C 语言中,逗号 `,` 是一个运算符,其优先级最低,结合方向是从左到右。整个表达式由三个主要部分组成(由逗号分隔):
1. `a=2`
2. `b=5`
3. `a>b ? a++ : b++`
4. `a+b`
**注意**:这里有一个常见的陷阱。三元运算符 `?:` 的优先级高于逗号 `,`。因此,表达式实际上被解析为:
`(a=2), (b=5), (a>b ? a++ : b++), (a+b)`
让我们一步步执行:
#### 第一步:初始化
- `a = 2`:变量 `a` 被赋值为 2。
- `b = 5`:变量 `b` 被赋值为 5。
此时:`a = 2`, `b = 5`。
#### 第二步:执行三元运算符 `a>b ? a++ : b++`
- 判断条件 `a > b`,即 `2 > 5`。
- 条件为 **假 (False)**。
- 因此,执行冒号后面的表达式:`b++`。
- **关键点**:`b++` 是**后置自增**。
- 它的值是 `b` 当前的值(5),但副作用是 `b` 会在该表达式求值后增加 1。
- 所以,执行完这部分后,`b` 变成了 **6**。
- `a` 保持不变,仍为 **2**。
此时:`a = 2`, `b = 6`。
#### 第三步:计算最终结果 `a+b`
- 逗号表达式的值是**最后一个子表达式的值**。
- 最后一个子表达式是 `a + b`。
- 代入当前的值:`2 + 6`。
- 结果为 **8**。
### 2. 易错点解析
* **误区1:认为 `b++` 没有生效或立即生效取值不同**
如果是 `++b`(前置自增),`b` 会先变成 6,然后取 6。
如果是 `b++`(后置自增),在这个三元表达式中,虽然表达式的“返回值”是 5(如果前面有赋值的话),但**副作用**(即 `b` 变为 6)在执行完该语句后已经发生。所以在接下来的 `a+b` 计算中,`b` 已经是 6 了。
* **误区2:优先级混淆**
有人可能会误以为 `a>b?a++:b++, a+b` 中的 `a+b` 是三元运算符的一部分。但实际上,三元运算符 `?:` 的优先级高于逗号 `,`。所以 `a+b` 是逗号表达式的最后一部分,独立于三元运算之外进行计算。
### 3. 结论
最终计算过程如下:
1. `a` 赋值为 2。
2. `b` 赋值为 5。
3. `2 > 5` 为假,执行 `b++`,`b` 变为 6。
4. 计算 `a + b`,即 `2 + 6 = 8`。
因此,正确答案是 **B**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第66题 (1.0分) 题号:146 用下列语句定义a,b,c,然后执行b=a、c='b'+b,则b,c的值是()。 long a=0xffffff; int b; char c;
单选题
1、第65题 (1.0分) 题号:636 若二维数组a有m列,则在a[i][j]前的元素个数为()。
单选题
1、第64题 (1.0分) 题号:659 凡是函数中未指定存储类别的局部变量,其隐含的存储类别为()。
单选题
1、第63题 (1.0分) 题号:524 与实际参数为实型数组名相对应的形式参数不可以定义为()。
单选题
1、第62题 (1.0分) 题号:570 以下叙述不正确的是()。
单选题
1、第61题 (1.0分) 题号:212 C语言中的文件类型只有()。
单选题
1、第60题 (1.0分) 题号:674 以下错误的描述是:函数调用可以()。
单选题
1、第59题 (1.0分) 题号:210 在位运算中,操作数每右移一位,其结果相当于()。
单选题
1、第58题 (1.0分) 题号:178 以下对C语言函数的描述中,正确的是()。
单选题
1、第57题 (1.0分) 题号:558 int a[10]={1,2,3,4,5,6,7,8};int *p;p=&a[5];p[-3]的值是()。
