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

关于两段C语言循环中表达式重复计算的技术问询

循环条件中表达式的重复计算问题

先看两段C代码:

int a = 100;
int b = 10000;
int c = 22;
int i;

for (i = 0; i < a + b; i++)
{
    c++;
}

#define MAX_GROUP_A_NUM 5000
#define MAX_GROUP_B_NUM 10000
#define MAX_GROUP_NUM (MAX_GROUP_A_NUM + MAX_GROUP_B_NUM)

for (i = 0; i < MAX_GROUP_NUM; i++)
{
    c++;
}

针对这段代码的疑问及解答如下:

疑问1:第一个循环中的a + b会被多次计算吗?

不一定,完全由编译器和编译优化选项决定:

  • 若未开启优化(比如默认的-O0参数),编译器通常会在每次循环时重新计算a + b,因为它不会主动分析变量在循环内是否被修改;
  • 若开启了优化(比如-O1及以上级别),编译器会检测到a和b在整个循环过程中没有被修改,会提前计算好a + b的结果并存在寄存器中,循环时直接用这个结果做判断,不会重复计算。

疑问2:第二个循环中的5000 + 10000会被多次计算吗?

不会。因为这里用的是预编译宏定义,在预处理阶段,MAX_GROUP_NUM就会被直接替换成5000 + 10000,而编译器在编译时会把这个常量表达式直接计算成15000,最终循环条件会变成i < 15000,循环时根本不会再执行加法运算。

疑问3:“答案取决于编译器实现及编译选项”的说法是否属实?

这个说法部分成立:

  • 对于第一个循环的a + b,确实取决于编译器和优化选项,符合疑问1的解释;
  • 但对于第二个循环的常量加法,因为预编译和编译阶段就会完成计算,不管编译器和优化选项如何,都不会重复计算,所以这部分不适用该说法。

内容的提问来源于stack exchange,提问作者nn huang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:17:35