2017-10-21 75 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

相关问题