You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言for循环条件中已赋值变量为何被重置为新值?

问题分析与解答

核心疑问解答

你的困惑点在于逗号运算符和for循环条件表达式的执行逻辑:

  • !i, p = a[i]是一个逗号表达式,C语言中逗号运算符的规则是:从左到右依次执行所有子表达式,整个表达式的最终值是最后一个子表达式的结果,但所有子表达式都会被执行,包括赋值操作。
  • 所以这里p = a[i]不是单纯的条件判断,而是会真的给p赋值,这就是为什么第一次循环前p从初始的15变成67的原因。

代码分步拆解

先明确初始值的转换:

  • 数组a的初始化:{66, 066, 0x66},其中:
    • 066是八进制数,转十进制为 6*8 + 6 = 54
    • 0x66是十六进制数,转十进制为 6*16 + 6 = 102
    • 数组长度为4,第四个元素默认初始化为0,所以初始a = [66, 54, 102, 0]
  • 变量初始值:i=0, s=0, p=15

第一次循环

  1. for初始化部分:++a[i] → i=0,a[0]从66变为67,此时a[0]=67
  2. for条件判断:!i, p = a[i]
    • 先执行!i:i=0,!0=1(结果被丢弃)
    • 再执行p = a[i]:p = a[0] = 67
    • 逗号表达式最终值为67(非零),进入循环
  3. 循环体执行:
    • p = a[i] >> 2 | p:a[0]=67,右移2位是16(二进制00010000),和p=67(二进制01000011)按位或,结果为83(二进制01010011),此时p=83
    • a[i] &= p:67 & 83 = 67,a[0]保持不变
  4. for末尾表达式:s += a[i++] → s = 0 + 67 = 67,i自增为1

第二次循环

  1. for条件判断:!i, p = a[i]
    • !i:i=1,!1=0(结果被丢弃)
    • p = a[1] = 54,表达式值为54(非零),进入循环
  2. 循环体执行:
    • p = a[1] >>2 | p:54右移2位是13,和p=54按位或得63,p=63
    • a[1] &= p:54 & 63 =54,a[1]不变
  3. for末尾表达式:s += a[i++] → s=67+54=121,i自增为2

第三次循环

  1. for条件判断:!i, p = a[i]
    • !i:i=2,!2=0(结果被丢弃)
    • p = a[2] =102,表达式值为102(非零),进入循环
  2. 循环体执行:
    • p = a[2] >>2 | p:102右移2位是25,和p=102按位或得127,p=127
    • a[2] &= p:102 &127=102,a[2]不变
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:53:30