1

伙计们,我是编程新手,我对后增量值的结果感到惊讶,现在我发现并执行下面的代码后感到困惑,如果 for 循环说 1. 初始化 2. 如果为 false 则检查条件终止 3. 递增。i++ 发生在哪里?i 值在哪里等于 1?

int main()
{
int i, j;

for (int i =0; i<1; i++)
{
    printf("Value of 'i' in inner loo[ is %d \n", i);




    j=i;
    printf("Value of 'i' in  outter loop is %d \n", j);
            // the value of j=i is equals to 0, why variable i didn't increment here?
}
    //note if i increments after the statement inside for loop runs, then why j=i is equals to 4226400? isn't spose to be 1 already? bcause the inside statements were done, then the incrementation process? where does i increments and become equals 1? 
    //if we have j=; and print j here
//j=i;  //the ouput of j in console is 4226400
//when does i++ executes? or when does it becomes to i=1?



return 0;
}

如果 Post increment 使用该值并加 1?我迷路了...请解释...非常感谢。

4

6 回答 6

2

我不太确定你在问什么,但有时初学者更容易理解是否重写为 while 循环:

 int i = 0;
 while (i < 1)
 {
     ...
     i++;  // equivalent to "i = i + 1", in this case.
 }
于 2013-06-12T03:06:19.953 回答
1

您的循环声明了新变量i,它隐藏了i之前在main(). 因此,如果您分配ij循环外部,您将调用未定义的行为,因为i未在该上下文中初始化。

于 2013-06-12T03:07:53.760 回答
1

在第一次迭代之前,i被初始化为0。正如您所说,这是“初始化”阶段。

然后评估循环条件。循环继续一个真值。

然后执行循环体。如果有一个continue;语句,这将导致执行跳转到循环的末尾,就在}.

然后评估增量运算符的副作用。

因此,在第一次迭代之后i变为1. i保留1整个第二次迭代的值。

于 2013-06-12T03:10:39.233 回答
1

看起来你有变量名的冲突:i在循环之前声明,也在循环内部。

i语句中声明的for是唯一一个永远为 1 的。在循环体执行后它将为 1。

尝试设置断点并使用调试器单步执行循环,同时查看变量的值(这是我使用调试器单步执行的视频)。

要消除调用两个变量的歧义,i您可以将 for 循环更改为:

for (i = 0; i < 1; i++) // remove the `int`

这将确保i您的代码中只有一个。

于 2013-06-12T03:47:51.033 回答
1

对@CarlNorum 的回答的评论看起来不像评论:

C标准定义

for ( A; B; C ) STATEMENT

意思几乎相同

{
    A;
    while (B) {
        STATEMENT
        C;
    }
}

(其中{}包含任意数量的语句的块本身就是一种语句)。但是循环continue;中的语句for会跳转到下一个语句之前C;,而不是下一个表达式测试B

于 2013-06-12T03:56:56.803 回答
0
for (i=0; i<x; i++)

相当于

i=0;
while(i<x) {
    // body
    i = i + 1;
}
于 2013-06-12T03:07:03.607 回答