2014-09-20 130 views
0

當我運行此代碼時,我得到的答案爲5,但我不明白這是如何工作的 根據我自己的理解,這應該是一個無限循環 ,因爲數值的值永遠不會改變它的內部功能範圍 該函數的輸出爲5,for循環只運行一次 我需要了解這裏的條件如何滿足。功能範圍不正確輸出

#include <stdio.h>  

int num=7;  

int r();  

int main() 
{  
    for(r();r();r())  
    { 
     printf("%d",r()); 
     return 0; 
    } 
} 

int r() 
{ 
    return num--; 
} 
+3

正確縮進/格式化你的代碼,你在循環內返回,根本不可能是無限的。 – Mat 2014-09-20 16:34:12

+1

只有一個'num',它當然不在一個函數的範圍內。 – chris 2014-09-20 16:34:16

+1

'return 0;'當它到達時立即結束主函數,所以它不會再循環。 – PeterT 2014-09-20 16:35:47

回答

0

比方說我們有這個for循環,其中ABCD是有效的表達式:

for (A; B; C) 
{ 
    D; 
} 

這等同於以下while循環:

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

由於您的循環中的Dprintf調用,然後執行return語句,循環將僅迭代一次(並且不執行C),然後從main函數返回,此函數將終止程序。

至於爲什麼你5印,那是因爲你叫printf之前r被調用了兩次,從7減少兩次5

如果展開循環,它會像

r(); // Initialization in `for` loop 
r(); // Condition in `for` loop 
printf(...); 
return 0; // Terminates the program 
1

執行過程中發生什麼事,以num

num = 7; 
r(); // first argument of for, init nothing → return 7, then num = 6 
r(); // second argument of for → return 6, then num = 5 
// third argument is done at the end of for, not now 
printf("%d",r()); // execute r() → return 5, then num = 4, but print 5 
return 0; // exit the current function or the process if it's in the main function 

有關信息:

num--; //返回num,然後減小num --num; //減小數字然後返回數字

對於++運算符來說,它們是相同的。

+0

內的循環我知道printf(「%d」,r())後面的函數更新和然後檢查條件條件如何爲false以終止循環,是因爲返回0; – user3692108 2014-09-20 16:45:58

+0

有'continue'關鍵字來啓動下一個循環,而'break'鍵兩次退出所有循環。 – 2014-09-20 17:02:36

0

如果縮進正確代碼:

include <stdio.h> 

int num = 7; 

int r() 
{ 
    return num--; 
} 

int main() 
{  
    for(r(); r(); r()) { 
     printf("%d", r());  
     return 0;  
    } 
} 

,你會看到,它不可能是一個無限循環,因爲你從它的第一次印刷後返回。

從局外變量函數中看不到局部變量的變化,但變量num是一個全局變量。 mainr都會看到這個全局變量的同一個實例。

至於爲什麼答案是5,重寫for循環相當於while循環:

int main() 
{ 
    r();       /* init */ 
    while (r()) {     /* condition */ 
     printf("%d", r());  
     return 0; 
     r();      /* update */ 
    } 
} 

r返回num原始值的功能。減免發生在返回之後。 (當然,它不會:編譯器會複製,減少並返回副本。)