2016-08-22 57 views
0

塊在C的Primer Plus麻煩的理解,作者說我有關於for循環和if語句

C99的功能,前面所提到的,是語句是 一個循環或語句的一部分即使不使用大括號(即,{} ),也可以作爲塊區分。更完全的說,整個循環是包含它的 塊的子塊,循環體是整個 循環塊的子塊。

我猜循環體意味着在下面的例子中printf(...)聲明。但這兩個大膽的詞是什麼意思? :「..一個整個循環是一個子塊到包含它,...」這將是很好,如果你能解釋它使用下面的例子!

for(int n =1;n<3;n++) 
    printf("%d \n",n); 

回答

2

的C11標準說,在§6.8.5循環語句

¶5迭代語句是一個塊,其作用域是其 封閉塊範圍的嚴格子集。循環體也是一個塊,其範圍是迭代語句的範圍 的嚴格子集。

我想這就是你引用的語句試圖解釋。

這是什麼驅動,有點不透明(歡迎閱讀標準的世界),是一個迭代語句(while循環,do … while循環或for循環)被視爲一個塊。這主要影響具有變量聲明的for循環。

考慮:

for (int i = 0; i < max; i++) 
    printf(" %d", i); 
putchar('\n'); 

的措辭意味着代碼功能,如果你有:

{ 
    for (int i = 0; i < max; i++) 
    { 
     printf(" %d", i); 
    } 
} 
putchar('\n'); 

這尤其限制了i範圍到for迴路;它不在循環外部訪問。循環體是一個塊,它的作用域是迭代語句的一個嚴格子集,並不是什麼大驚喜。周圍的街區不那麼明顯,可能會讓人吃驚。

4

據措辭有點嚴重,但它很簡單:

for(int n =1;n<3;n++)  // <-- loop 
    printf("%d \n",n);  // <-- block 

循環體是如你所說的這種情況下,printf(),而在一般情況下,試圖讓我的回答是最低成爲可能,這是格式:

for(...; ....;) 
    body_of_loop 

在嵌套循環或語句時發揮作用。例如,對於環雙:

1. for(int i = 0; i < 10; ++i)   
2. for(int j = 0; j < 10; ++j)  
3.  printf("hi\n"); 

更完全,整個環是子塊到包含它的塊,並且循環體是一個子塊的整個循環塊。

所以,第2行是一個整個循環和它的子塊到它的一部分。外部for循環的塊是線2和3

3

如果你有一個碼塊,例如:

while(1)     <-- code block (contains if [that contains printf]) 
    if(2)    <-- sub block (contains printf) 
     printf("3");  <--- part of if block 

中的printf被認爲是,如果塊的一部分,並且如果封鎖自己(現在也包含printf)被認爲是更大塊的一部分。這可能會繼續下去......

while(1) 
    while(2) 
    if(3) 
     for(;;) 
     i++; 

在座的每3月中行是子塊包含以下行