以下两个for循环都将被执行N+1次:
for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
在这两个表达式中,哪一个更快计算(i <= N or i < N + 1)?我知道有一个类似的流行问题(Is < faster than <=?),但是我认为这个问题不同,因为我们在将1添加到一个可能不是常量的变量,然后将其与i进行比较,而不是与一个常量值进行比较。
以下两个for循环都将被执行N+1次:
for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
在这两个表达式中,哪一个更快计算(i <= N or i < N + 1)?我知道有一个类似的流行问题(Is < faster than <=?),但是我认为这个问题不同,因为我们在将1添加到一个可能不是常量的变量,然后将其与i进行比较,而不是与一个常量值进行比较。
首先,如果 N
是常量,则编译器会在编译时计算 N+1
,并为两个选项生成相同数量的指令。关于变量与常量比较的情况,在此问答中有很好的解释。
当 N
是一个只在运行时可用的变量时,一个运行在高级优化水平的编译器也可能为两种比较生成相同的代码。
我使用 gcc
在 -O3
优化级别下进行了实验,给它这两个代码片段:
scanf("%d%d", &j, &k);
if (j < k+1) {
printf("hello\n");
}
并且
scanf("%d%d", &j, &k);
if (j <= k) {
printf("hello\n");
}
我使用了scanf
来防止编译器完全优化表达式。
两种情况下生成的汇编代码是相同的:
movl -8(%rbp), %eax
cmpl -4(%rbp), %eax
jg LBB0_2
在IT技术中,当j
大于k
时,会将j
与k
进行比较,并跳过对printf
的调用(优化器已将其替换为对puts
的调用)。
N
是类类型对象(支持相应操作)的情况进行注释。 - Peter
N + 1
不会被计算 N 次,所以我不明白这样做的意义... - RaphaMexN
不是一个常量值,那么这两个表达式并不完全相同;N + 1
可能会溢出。 - Keith Thompson