繁体   English   中英

for循环中的小疑问

[英]Small doubt in for-loops

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

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

在我看来,答案是11,但我的模块说是10 ?! 我想念什么?

十一,在每次循环迭代开始时测试条件,然后调用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)

仅当x <10时循环才会运行,因此x都是0-9而不是0-10的所有值。 0-9共有10个值,因此循环运行10次。

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

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

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

如果你想要做的事情的正确方法,并学会调试软件的过程中,通过读取启动

这是带有上面代码的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       }

如果您的问题是表达式x < 10的计算次数是多少,答案取决于-。 这取决于编译器优化。 如果编译器生成幼稚的代码,则它将对其进行11次评估。 如果编译器完全展开循环,则答案将为0。介于两者之间的任何值也是可能的。

0-9处有十个值,但将测试 11次,最后一次返回false,退出循环。

是。 TEST将执行11次,正文仅执行10次。

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

X从零开始,但是在9结束,因为您的代码在x小于10时循环,因此这里有一些解决方法:

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

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

这些都将导致11

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

for循环如下所示:

环

这样就可以测试条件:

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

因此,进行10次交互会进行11次测试。 简单!

10次​​ -

  1. 给x赋0
  2. 检查x <0是否为真,否则为6
  3. 执行循环体
  4. 增量x
  5. 转到2。
  6. 循环后的代码

如果经过它,最终将导致循环主体被调用10次,因为第十一次循环条件变为假,并且该主体从不执行。

是的, x < 10表达式被评估11次。 前10次为true,最后一次为false(因为x==10 )。

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

x被测试了n+1次(其中n是10), 但是仅由于您使用<运算符*,所以满足了n次条件

看效果:

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

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

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

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

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

同样,您也可以这样考虑:for(x = 1; x <2; x ++)

当x = 1而不是x = 2或(2-1)倍时,它将执行循环内容。 因此,要记住的重要事情是它何时真正脱离循环,以及x的哪些值在循环内容内运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM