以下两个for循环都将被执行N + 1次:
for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
两个表达式中的哪一个(i <= N或i
答案 0 :(得分:5)
首先,如果N
是常量,编译器会在编译时计算N+1
,并为两个选项生成相同数量的指令。变量与常数比较的情况在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
。