2011-10-08 50 views
0

当amt为0时程序忽略停止,直到输入了10个数字。该程序在输入10个数字后也不会停止。我的错误在哪里?在C中使用while循环的复合条件。

main() { 
int amt; 
int tot = 0; /* running total */ 
int i = 0; /* counts number of times in loop */ 
while (amt!=0 || i < 10) 
    { 
    printf("Enter a number (enter 0 to stop): "); 
    scanf("%d", &amt); 
    tot = tot + amt; 
    i++; 
    } 
printf("The sum of those %d number is %d.\n", i, tot); 

} 
+1

请只是编译代码与所有的警告开启您张贴在这里了。任何像样的编译器都会告诉你像“使用单位化的值'amt'”,并且'main'的原型是不同的。 –

+0

@JensGustedt - 你应该添加这个答案。令人惊讶的是,没有人甚至认为编译器警告可能实际上告诉你代码有问题。 –

+0

@ D.Shawley,不,不,我不希望SO被重载过度。我只想解决这个问题,这对其他人没有任何用处。 –

回答

3

您的测试发生在分配amt之前。因此其结果是不确定的。该测试应移至迭代结束时,即do/while。虽然你可以将amt分配给一些非零值,但这对我来说会有点不整洁。

当然你的意思是使用逻辑AND而不是逻辑或?如果两个amt非零并且i<10,您只想继续迭代。

当然,如果您确实将测试移动到迭代结束时,那么您必须考虑到i已在循环内部增加的事实。

1
int amt; 

既然你不初始化。它有一些随机值,并导致程序中的未定义行为。
您应始终使用值初始化局部变量。

2

为了停止后10个号码或AMT = 0(以先到者为准满足),你就必须改变循环条件while (amt!=0 && i < 10)

+0

谢谢。这是正确的答案。该计划没有给出任何未定义的行为 - 它只是没有适当地遵守条件。 – jrasa

+2

@jrasa该程序确实有未定义的行为。这很简单。这个答案肯定不是完整的故事。如果第一次进行测试时'amt'恰好为零,那么一旦您改变使用'&&',您将不再进入循环。在你的程序版本中,未定义的行为是良性的,因为从我<10持有以来第一次测试总是评估为真。 –

+1

@jrasa我完全同意上面的评论 - 条件不是唯一的问题,尽管对于您的输入数据很重要。如果您只是改变条件,其他提到的因素可能会导致意想不到的结果。 – Lyth