C语言for循环初始化中三元运算符的使用及调试疑问
关于C语言for循环三元运算符初始化的疑问
刚接触C语言,正在通过练习题备考测试,对以下for循环中用三元运算符初始化int j的写法存在疑问:
for (int j = i ? foo : 2; j < 10; j++)
完整代码如下:
#include <stdio.h> int main (void) { int foo = -1; do { int i = foo++; if (foo > 8) break; else if (foo < 5) continue; for (int j = i ? foo : 2; j < 10; j++) { printf("foo=%d, i=%d, j=%d;", foo, i, j); } i = foo++; } while (1); return foo; return 0; }
调试过程中发现两个现象:
- do-while循环第6次循环时首次进入for循环,此时
i=4、foo=5,但调试器显示j=0(未显式初始化0); - 单步执行时
j从0变为5(等于foo值),对此无法理解。
问题解答
1. 三元运算符初始化的工作原理
三元运算符条件 ? 表达式1 : 表达式2的逻辑非常直接:
- 若
条件结果为非0(真),执行并返回表达式1的值; - 若
条件结果为0(假),执行并返回表达式2的值。
对应到你的代码里,int j = i ? foo : 2的含义是:
- 当
i不等于0时,j被初始化为foo的当前值; - 当
i等于0时,j被初始化为2。
你首次进入for循环时i=4(非0),所以j会被初始化为foo=5,这和单步执行后的结果一致。
2. 为什么调试器先显示j=0,之后变为5?
这不是j未初始化的问题——你的代码里j是明确通过三元运算符完成初始化的,不存在未定义的随机值。
出现这个现象是调试器的显示时机导致的:在j的初始化语句执行完成前,调试器读取的是栈内存中该位置的旧残留值(刚好是0);当单步执行完int j = i ? foo : 2这行代码后,j才被正式赋值为5,所以你会看到数值的变化。
内容的提问来源于stack exchange,提问作者paranoid_android
相关产品推荐
相关产品推荐

