分号 - 如何搞乱这个练习

时间:2014-04-29 01:09:43

标签: c

我知道在循环后我不应该加分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误发生了什么。所以下次发生类似的事情时,我知道错误的来源。

在下面的代码中,代码的这一部分:

triangularNumber = 0;
for ( n = 1; n <= number; ++n )
    ;

我在for循环后意外插入了一个半冒号。当我执行整个代码时,它会提示用户插入一个数字来计算TriangularNumber。但是用分号结果是错误的。例如,当我插入10时,答案应该是55,但是分号错误会给我56. 我想理解为什么56。

完整的代码如下:

#include <stdio.h>

int main(void) 
{
    int n, number, triangularNumber, counter;

    for(counter = 1; counter <=5; counter++) 
    { 
        printf("What Triangular Number do you want?");
        scanf("%i", &number);

        triangularNumber = 0;
        for ( n = 1; n <= number; ++n )
        **;**    

        triangularNumber += n;

        printf("Triangular number %i is %i\n\n", number, triangularNumber);     
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

其他答案都很好,但要回答你的问题,为什么你得到你所具体的特定号码(当你输入10而不是56时这将是11),这是因为:

for ( n = 1; n <= number; ++n )
    ;  

除了n正好比number好1之外,基本上没有任何内容,因此当number等于10时,n将等于11

然后,这个:

triangularNumber += n;

只需将triangularNumber设置为11,因为在循环之前将其设置为0,所以当它位于循环之外时,就像它使用分号一样在那里,triangularNumber += n;基本上等同于triangularNumber = n;

顺便提一下,如果你在n循环中定义了for,而不是在main()的开头,那么(你可能需要将你的编译器放在C99中)使用-std=c99或类似的模式执行此操作):

for ( int n = 1; n <= number; ++n )
    ;    

triangularNumber += n;

然后你已经立即发现了错误,因为程序无法编译,就像你在triangularNumber += n; 外面循环一样{{1将不再在范围内。这是将变量范围限制为所需代码量的一个很好的理由,这通常是一个好主意。

答案 1 :(得分:0)

第二个for语句没有大括号,因此代码运行; number 次!

你想:

for ( n = 1; n <= number; ++n )
{
   **;**
   triangularNumber += n;
}

答案 2 :(得分:0)

关键字for是每次循环完成时运行的单个语句的前言。由于分号结束语句,因此以下循环在每次迭代时都不会执行任何操作 for ( n = 1; n <= number; ++n ) ;
然后继续执行后续语句(triangularNumber += n;),该语句执行一次。

同样的原则也适用于ifwhiledo关键码。在所有这些情况下,为您提供灵活性的是这条规则:一对括号内的所有内容都被视为一种陈述。

因此,您的代码需要看起来像这些示例中的一个,以实现您可能想要的方式。

for ( n = 1; n <= number; ++n ) triangularNumber += n;

-OR -

for ( n = 1; n <= number; ++n )
{
    triangularNumber += n;
} //everything between the braces is considered to be the one statement executed by the loop

答案 3 :(得分:0)

这样想:

    loop {
       do this;
       and also this;
    }
    and more code outside the loop;

现在,如果你有一个&#34 ;;&#34;没有代码,它将如下所示:

 loop {    
    ; 
    } 
    and more code outside the loop;

;是一个空白语句,每次循环都会运行。

现在如果你删除括号,请看一下:

loop
   ;
and some code outside of the loop;

由于没有括号,循环只包含下一行代码,在本例中为空行&#34 ;;&#34;。那之后的那一行&#34;以及循环之外的一些代码;&#34;因为它在循环之外,所以无论如何都会被执行。 基本上,如果你没有括号,代码就会被包含在一行代码中。一行之后的任何内容都在括号之外并且不在循环中。

我希望这能解决问题!