鱼C论坛

 找回密码
 立即注册
查看: 24|回复: 3

小问题求助

[复制链接]
发表于 昨天 22:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int i=5,int a;
a=(++i)+(++i)+(++i);
为什么运行结果a=22??i最后应该=8。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 22:13 | 显示全部楼层
int i=5,int a;
a=(++i)+(++i)+(++i);


在C/C++中,表达式 a=(++i)+(++i)+(++i) 属于未定义行为(undefined behavior),因为它在同一个表达式中多次修改了变量 i 的值,并且没有明确的序列点来规定求值顺序。因此,不同编译器可能会产生不同的结果。

在你使用的编译器中,可能按照以下顺序计算:

  1. 初始 i=5
  2. 1. 先执行前两个 ++i,使得 i 依次变为 6、7。
  3. 2. 此时前两个 ++i 都取当前 i 的值(即 7),所以前两部分的和为 7+7=14。
  4. 3. 再执行第三个 ++i,使得 i 变为 8,并取值 8。
  5. 4. 最后总和为 14+8=22。
  6. 执行完毕后,i 的最终值为 8。
复制代码


请注意,这种结果并不是语言标准规定的,而是编译器具体的实现行为。为了避免此类问题,在实际编程中应该避免在同一个表达式中对同一个变量进行多次修改,而应该分步书写,例如:

  1. int i=5, a;
  2. ++i; // i=6
  3. ++i; // i=7
  4. ++i; // i=8
  5. a = i + i + i; // a=24
  6. // 或者根据你的具体意图分步计算
复制代码


总之,未定义行为会导致代码不可移植且难以预测,务必保持表达式简洁明确。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:29 | 显示全部楼层
此时前两个 ++i 都取当前 i 的值(即 7),所以前两部分的和为 7+7=14。
这是为什么?不是应该先算第一个++i,此时i=6,再依次算后两个,然后得出a=6+7+8=21吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:30 | 显示全部楼层
但求过程001 发表于 2026-01-28 22:29
此时前两个 ++i 都取当前 i 的值(即 7),所以前两部 ...


你的困惑在于表达式 a=(++i)+(++i)+(++i) 在不同编译器中的求值方式不同。由于这是C/C++中的未定义行为,结果并不固定。

在你遇到的编译器中,可能采用了以下求值顺序:

1. 先处理前两个 ++i,连续执行两次自增,i 从5变为6再变为7。
2. 然后取这两个子表达式的值,此时 i 已经是7,所以两个都得到7,和为14。
3. 再处理第三个 ++ii 从7自增到8,得到8。
4. 最后总和为14+8=22,i 最终为8。

你期望的 6+7+8=21 是另一种可能的求值顺序(从左到右依次计算),但编译器并没有规定必须从左到右求值。

因此,为了避免这种不确定性,应当将代码拆分成多个语句,明确顺序:


  1. int i=5, a;
  2. ++i; // i=6
  3. ++i; // i=7
  4. ++i; // i=8
  5. a = i + i + i; // 根据你的意图调整
复制代码


记住:永远不要在同一个表达式中对同一个变量进行多次修改,否则会导致未定义行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-29 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表