2015-10-06 134 views
-1
void main() 
{ 
    int a; 
    a=10; 
    do 
    while(a++<10); 
    while(a++<=11); 
    printf("%d",a); 
} 

上述程序给出了14的输出。 你能解释为什么吗?C程序while循环

回答

1

大括号会使它更具可读性,但正如您所拥有的,执行流和的一致的解释:

enter image description here

+0

很好的解释。但是当它是14而不是13时它为什么会离开? – Deant

+0

@Deant - 看第4步。它在13进入循环,因为13不是<= 11,而是后增加到14,所以它离开外循环。 – ryyker

+0

我现在明白了。非常感谢 – Deant

0

那么后增量只会发生在条件被评估之后,所以即使条件为假,a也会增加,并且可能会增加更多循环的运行次数,然后您会期待。

+0

我知道后增量应用在这里,但他们如何应用? – Deant

+2

*“他们如何应用?”*答案说:条件评估后。 'a'增加了四次,因为外部'while'循环被执行了两次,并且它的两个语句中的每一个都增加了'a'。正确缩进代码,它会更容易看到。 –

+0

几乎你需要明白,最后一次打印只发生一次,因为它是在“块”之外(这是为什么12不打印)。所以虽然它仍然会数到14,因为a增加了4次,但只有三次打印会发生(即11,13,14)。 – Parttimereaper

2

此代码会让你明白为什么,当你键入++它总是递增

void main() 
{ 
    int a; 
    a=10; 
    do{ 
    while(a++<10); 
    printf("%d",a); 
} 
    while(a++<=11); 
    printf("%d",a); 
} 
+0

更混乱。输出是11 13和14.我明白a的第一个值后递增得到11.但你怎么解释13和14. – Deant

2

这里你的代码评估为

int main() 
{ 
    int a; 
    a=10; 
    do{ 
      //---> second iteration a= 12, for post iteration in while 

     while(a++<10); // First iteration: a=10 ,so false| second Iteration: a=12, so false 

     //First iteration: Here a=11, as previous line's post increment| Second iteration: here a=13, as previous post increment 

    } while(a++<=11); //First iteration: a==11, that evaluete true, go to --->, line after do | Second iteration: a=13, false, loop end goto next line 

    //Here a=14 for post increment in previous line's while loop 

    printf("%d",a); // a=14 
} 

在后增量首先评估与当前值的表达式,然后递增变量的值。

例如在第二次迭代时,外部程序开始执行时,while(a++<=11),此时a=13与之前的值a一样。这a++<=11执行并返回0,这使得while(0)(因为a = 13,这是大于11)。然后增量发生,a变为14.如while(0)它打破了do-while循环并转到下一条指令并打印出值14.

+0

很清楚的解释。但如果条件是错误的,为什么14打印 – Deant

+0

@Deant,回答编辑,可能你可以理解这一次。 – ashiquzzaman33

+0

现在我明白了。谢谢。 – Deant

2

哦,这是邪恶的。重新格式化代码应该显示发生了什么:

a=10; 
do 
{ 
    while(a++<10); 
} 
while(a++<=11); 

所以。 a最初设置为10。我们输入do while循环。 do while循环中的唯一声明是while(a++ < 10);。请记住,表达式a++评估为当前值a,并且作为副作用增量a

因此,a++ < 10被评估。结果为false10不小于10),但作为评估该表达式的结果,a递增,现在具有值11。在do while循环结束时,我们评估a++<=11。由于a当前的值为11,因此该评估为true。作为评估表达式的结果,a增加到12

我们再次执行do while循环的主体。再次评估表达式a++ < 10。与之前一样,结果为false,但作为评估表达式a的结果递增到13

然后,我们再次评估a++ <= 11。结果为false,因为13不小于或等于11,并且a递增一次

因此,当整个混乱结束时,a14

汇总:

  1. a最初10;
  2. do while进入循环
  3. a++ < 10进行评价时,现在a11
  4. a++ <= 11进行评价时,现在a12do while循环重复
  5. a++ < 10进行评价时,a现在13
  6. a++ <= 11被评估,a现在是14,do while环路退出。
+0

非常详细的解释。非常感谢。但为什么它停在14? – Deant

+0

@Deant:我认为上面的解释清楚地表明了 - 我们两次评估“a ++ <10”和“a ++ <= 11”两次,这意味着我们评估总共四次“a ++”;这有效地将'4'添加到'a'的初始值。 '14'不小于或等于'11',这就是为什么'do while'循环在第二次迭代后退出的原因。 –

+0

刚刚得到它。非常感谢。 – Deant