关于两段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
相关产品推荐
相关产品推荐

