C语言for循环条件中已赋值变量为何被重置为新值?
问题分析与解答
核心疑问解答
你的困惑点在于逗号运算符和for循环条件表达式的执行逻辑:
!i, p = a[i]是一个逗号表达式,C语言中逗号运算符的规则是:从左到右依次执行所有子表达式,整个表达式的最终值是最后一个子表达式的结果,但所有子表达式都会被执行,包括赋值操作。- 所以这里
p = a[i]不是单纯的条件判断,而是会真的给p赋值,这就是为什么第一次循环前p从初始的15变成67的原因。
代码分步拆解
先明确初始值的转换:
- 数组
a的初始化:{66, 066, 0x66},其中:066是八进制数,转十进制为6*8 + 6 = 540x66是十六进制数,转十进制为6*16 + 6 = 102- 数组长度为4,第四个元素默认初始化为0,所以初始
a = [66, 54, 102, 0]
- 变量初始值:
i=0, s=0, p=15
第一次循环
- for初始化部分:
++a[i]→i=0,a[0]从66变为67,此时a[0]=67 - for条件判断:
!i, p = a[i]- 先执行
!i:i=0,!0=1(结果被丢弃) - 再执行
p = a[i]:p = a[0] = 67 - 逗号表达式最终值为67(非零),进入循环
- 先执行
- 循环体执行:
p = a[i] >> 2 | p:a[0]=67,右移2位是16(二进制00010000),和p=67(二进制01000011)按位或,结果为83(二进制01010011),此时p=83a[i] &= p:67 & 83 = 67,a[0]保持不变
- for末尾表达式:
s += a[i++]→s = 0 + 67 = 67,i自增为1
第二次循环
- for条件判断:
!i, p = a[i]!i:i=1,!1=0(结果被丢弃)p = a[1] = 54,表达式值为54(非零),进入循环
- 循环体执行:
p = a[1] >>2 | p:54右移2位是13,和p=54按位或得63,p=63a[1] &= p:54 & 63 =54,a[1]不变
- for末尾表达式:
s += a[i++]→s=67+54=121,i自增为2
第三次循环
- for条件判断:
!i, p = a[i]!i:i=2,!2=0(结果被丢弃)p = a[2] =102,表达式值为102(非零),进入循环
- 循环体执行:
p = a[2] >>2 | p:102右移2位是25,和p=102按位或得127,p=127a[2] &= p:102 &127=102,a[2]不变
- for末尾表达式:
s += a[i++]→s=121+102=223,i自增为3
循环结束
for条件判断:!i, p = a[i]
!i:i=3,!3=0(结果被丢弃)p = a[3] =0,表达式值为0,循环终止
最终printf("%d", s)输出223
内容的提问来源于stack exchange,提问作者Uros Lalic
相关产品推荐
相关产品推荐

