for循环中的小疑问

时间:2010-12-30 20:29:49

标签: c++ c loops

以下代码段中“x”值将被测试多少次?

int x;
for(x=0;x < 10; x++)
   printf("%d",x);

对我而言,答案似乎 11 ,但我的模块显示 10 ?我错过了什么?

12 个答案:

答案 0 :(得分:8)

11,在每次循环迭代的开始测试条件时,在调用printf之前:

0 < 10 == true
1 < 10 == true
2 < 10 == true
3 < 10 == true
4 < 10 == true
5 < 10 == true
6 < 10 == true
7 < 10 == true
8 < 10 == true
9 < 10 == true
10 < 10 == false    // exit from loop (printf not executed)

答案 1 :(得分:3)

只有当x&lt; 10,所以x都是0-9的值,而不是0-10。有10个值0-9,所以你的循环运行10次。

或者,如果你只是谈论比较,那么是的,它是11次测试。您的模块不正确。

答案 2 :(得分:2)

如果您对调试器不满意,可以作弊:

int main() {
    int x;
    for(x=0;(printf("testing %d\n", x) || 1) && (x < 10); x++)
        printf("%d\n",x);
    return 0;
}

打印

testing 0
0
testing 1
1
testing 2
2
testing 3
3
testing 4
4
testing 5
5
testing 6
6
testing 7
7
testing 8
8
testing 9
9
testing 10

如果您想以正确的方式做事并学会在此过程中调试软件,请先阅读this

这是一个带有上述代码的gdb会话。您可以计算环路测试线被击中的次数。这是11。

$ gdb loop
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/nathan/c/loop...done.
(gdb) break 6
Breakpoint 1 at 0x4004ec: file loop.c, line 6.
(gdb) run
Starting program: /home/nathan/c/loop 

Breakpoint 1, main () at loop.c:6
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) n
testing 0
7               printf("%d\n",x);
(gdb) 
0
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 1
7               printf("%d\n",x);
(gdb) 
1
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 2
7                   printf("%d\n",x);
(gdb) 
2
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 3
7               printf("%d\n",x);
(gdb) 
3
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 4
7               printf("%d\n",x);
(gdb) 
4
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 5
7               printf("%d\n",x);
(gdb) 
5
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 6
7               printf("%d\n",x);
(gdb) 
6
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 7
7               printf("%d\n",x);
(gdb) 
7
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 8
7               printf("%d\n",x);
(gdb) 
8
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 9
7               printf("%d\n",x);
(gdb) 
9
6           for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++)
(gdb) 
testing 10
8           return 0;
(gdb) 
9       }

答案 3 :(得分:2)

如果您的问题是关于评估表达式x < 10的次数,答案是 - 这取决于。这取决于编译器优化。如果编译器生成天真的代码,那么它将评估它11次。如果编译器完全展开你的循环,答案将是0.介于两者之间也是可能的。

答案 4 :(得分:1)

在0-9有10个值,但是测试 11次,最后一次返回false,退出循环。

答案 5 :(得分:1)

是。 TEST 将执行11次,身体只执行10次。

答案 6 :(得分:1)

for(x=0;x < 10; x++) 

X从0开始,但它在9结束,因为你的代码循环而x小于10所以解决这个问题是一些解决方案:

for(x=0;x <= 10; x++) 

for(x=0;x < 11; x++) 

这些都会导致11

答案 7 :(得分:1)

嘿,伙计们,这要容易得多!

for循环看起来像:

loop

这使得条件得到了测试:

  • 在第一次迭代之前,
  • 每次迭代后。

因此,10次交互给出了11次测试。简单!

答案 8 :(得分:0)

10次 -

  1. 将0分配给x
  2. 检查x&lt; 0是真的,如果没有去6
  3. 执行循环体
  4. 增量x
  5. 转到2.
  6. 循环后的代码
  7. 如果你经历它,你最终会调用循环体10次,因为第11次循环条件变为false并且身体永远不会被执行。

答案 9 :(得分:0)

是的,x < 10表达式被评估了11次。前10次是真的,最后时间是假的(因为x==10)。

答案 10 :(得分:0)

你是认真的吗?这应该是直观的!

x已经过n+1次测试(其中n为10),但条件只满足n次,因为您使用的是<运算符*

看效果:

int x;
for(x=0;x < 10; x++)
   printf("%d",x);
printf("%d",x);

最后一个print语句应输出10,表示x再次被测试(因为我们从零开始,x实际测试了11次)。

答案 11 :(得分:0)

这是一个通常在面试问题中被问到的脑筋急转弯。一种简单的检查方法是将其从10改为1,即基本情况:

for(x = 0; x&lt; 1; x ++)printf(“%d”,x);

它被打印一次。当x = 1时,它会跳出循环,并且不会包含在for循环的内容中。因此,它被打印“x”次,而不是“x + 1”次。

此外,您还可以将其视为: for(x = 1; x <2; x ++)

当x = 1时执行循环内容,但不执行x = 2或(2 - 1)次。 所以要记住的重要一点是,当它实际上突破循环时,x的哪些值在循环内容中运行。