以下两个for循环将执行N + 1次:
for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
这两个表达式(i Is < faster than <=?),但我认为这是不同的,因为在这里,我们将1加到一个可能不是常量的变量上,然后将其与i进行比较,而不是将其与恒定值进行比较。
最佳答案
首先,如果N
是常量,则编译器在编译时计算N+1
,并为两个选项生成相同数量的指令。可变vs常数比较的情况在this Q&A中得到了很好的解释。
当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
当
j
大于k
时,它将printf
与puts
进行了比较,并跳过了j
的调用(该优化器已替换为对k
的调用)。关于c++ - 在C++中哪个更快:i <= N或i <N + 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47851849/