2017-02-05 52 views
5

在for循環中,我們使用的是++i,這意味着在循環開始執行之前,i會增加到1。我在這裏弄錯了什麼?爲什麼str1 [0]的第一個賦值是?不應該是str1 [1]?

下面是代碼:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char str1[100], str2[100]; 
    int i; 
    scanf("%s", str1); 
    for (i = 0; str1[i] != '\0'; ++i) { 
     str2[i] = str1[i]; 
    } 
    str2[i] = '\0'; 
    printf("%s\n", str2); 
    return 0; 
} 
+1

;是什麼讓你承擔這個? – alk

+2

我不明白爲什麼要低估這個問題,這是少數有意義的問題之一,非常有效。 –

+0

供您參考[C標準(草案)的相關章節](http://port70.net/~nsz/c/c11/n1570.html#6.8.5.3):「* for(clause-1; expression-2; expression-3)statement [...]在每次執行循環體後,表達式-3被評估爲void表達式*「 – alk

回答

5

for循環的語法是由三​​個語句。第三步(「更新步驟」)在循環主體的末尾處執行。所以在第一次迭代中,我是零。

表達

for(init_stmt; cond_expr; update_stmt) 
    body_stmt; 

會導致代碼大致等同於以下內容:

{ 
    init_stmt; 
    while(cond_expr) { 
    body_stmt; 
    update_stmt; 
    } 
} 
+0

我們可以稱之爲更新語句而不是inc_stmt。 – Rishi

+0

@Rishi - 這確實是一個更好的術語,謝謝。 – StoryTeller

1

恐怕你錯了:在for語句的表達增加的背景下, ++i,i++,i += 1i = i + 1都具有相同的效果。此外,在評估條件之前,在每次迭代之後,該增量表達式被執行一次,但是在第一次迭代之前在之前沒有。下面是該for聲明評估步驟:

  1. 計算初始化表達式i = 0;
  2. 評估條件表達式:如果它是假的,退出循環。
  3. 評估循環體:
    • 如果break語句進行評價時,退出循環
    • 如果continue語句被評估分支直接進行到步驟4;
    • 否則,分支到步驟4。
  4. 評估增量表達++i;
  5. 分支步驟2

最後一條語句正確地使用str2[i] = '\0';。在for循環結束時i的值是第一個失敗的條件,其中str1[i] == '\0',其被稱爲str1中C字符串的長度。這是您要在str2中存儲空終止符的索引。

注意,代碼可以簡化,並且更加安全這樣:

#include <stdio.h> 

int main(void) { 
    char str1[100], str2[100]; 

    if (scanf("%99s", str1) == 1) { 
     for (int i = 0; (str2[i] = str1[i]) != '\0'; i++) { 
      continue; 
     } 
     printf("%s\n", str2); 
    } 
    return 0; 
} 
1

你的前提是錯誤的。在循環開始之前,i不會遞增爲1。

for (initialization_statement; conditional_statement; update_statement) { 
    body_of_for_loop 
} 

方式for循環的工作原理是它執行初始化語句,然後檢查,如果條件語句是true。如果條件語句是true,則執行for循環的主體。執行for循環的主體後,會執行更新語句,然後再次對條件語句進行評估,依此類推。

0

對於循環語法:

for (initialization; condition; increment or decrement) 
{ 
     //Code 
} 

步驟1:初始化變量(i = 0)。

步驟2 ::檢查條件(str1[i] != '\0'

步驟3:如果條件,然後轉到用於循環體。

第4步:成功執行循環體後,進入增量或減量操作部分(++i)。

查看圖片以獲得更多理解。

img

「使用++我這意味着在循環開始*之前i遞增1 *」 無
相關問題