2017-10-21 68 views
1

我在C語言書中找到了這個例子。 此代碼將轉換輸入數字庫並將其存儲在數組中。這條語句背後的邏輯是什麼:for(--index; index> = 0; --index)?

#include <stdio.h> 

int main(void) 
{ 
    const char base_digits[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    int converted_number[64]; 
    long int number_to_convert; 
    int next_digit, base, index = 0; 

    printf("type a number to be converted: \n"); 
    scanf("%ld", &number_to_convert); 

    printf("Base\n"); 
    scanf("%i", &base); 

    do 
    { 
     converted_number[index] = number_to_convert % base; 
     ++index; 
     number_to_convert = number_to_convert/base; 
    } 
    while (number_to_convert != 0); 

    // now display the number 
    printf("converted number = :"); 

    for (--index; index >= 0; --index) 
    { 
     next_digit = converted_number[index]; 
     printf("%c", base_digits[next_digit]); 
    } 

    printf("\n"); 
    return 0; 
} 

我無法理解最後一個循環。它應該有助於扭轉陣列,但我不明白!

這行是什麼意思:for (--index; index >= 0; --index)

+0

我想補充一點,這是一本書,你應該在垃圾桶裏,如果你遇到類似的循環折騰在它裏面。 ** dasblinkenlight **輕鬆地突出了一種更好的方法,任何值得他的鹽的程序員都可以提出。 –

回答

1

回想for報頭具有三個部分:

  • 聲明/初始化一部分被循環之前執行一次,
  • 該被每次迭代之前執行的結束條件檢查器,以及
  • 的部分將循環向前推進到下一次迭代

通常,聲明/初始化部分設置新的循環變量。但是,這並不是必需的。特別是,當多個循環共享相同的循環變量時,初始化部分調整現有值或完全缺失。

這正是發生在您的情況。 do/while循環將index前進到數組末尾的一個。如果您需要從converted_number後面開始處理,則需要在進入循環之前減少index,然後在每次迭代中遞減它。

注意,另一種可能性是在index可以使用while循環預減:

while (index > 0) { 
    next_digit = converted_number[--index]; 
    printf("%c", base_digits[next_digit]); 
} 
+1

對於'while'循環,你希望'index> 0',就像它是'0'一樣,你會將它預置爲-1,然後訪問'converted_number [-1]',導致未定義的行爲 –

+0

@ChrisDodd你是對的,謝謝! – dasblinkenlight

相關問題