为什么我从代码中获得无限循环?

时间:2017-08-15 17:05:44

标签: c loops

#include <stdio.h>

int main() {    
    int num; 
    int square;
    int sum;

    while (num) {
        if (num > 0) {
            scanf("%d", &num);
            square = num * num;
            sum = square + sum; 
            printf("%d          \n", sum);
        }
    }
    return 0; 

我试图产生正数的平方和,当输入第一个负数时,循环结束。结果需要左对齐10个空格。

3 个答案:

答案 0 :(得分:2)

代码具有未定义的行为:第一次测试num的值时,它是未初始化的。如果碰巧不是负数,则扫描一个​​新值并将其方块添加到未初始化的变量sum,产生更多未定义的行为,值输入为负,下一个测试失败并且循环永远重复。

使用%-10d转换格式获得10个空格宽度的左对齐。

以下是更正后的版本:

#include <stdio.h>

int main(void) {
    int num, square, sum = 0;

    while (scanf("%d", &num) == 1 && num != 0) {
        square = num * num;
        sum = square + sum; 
        printf("%-10d\n", sum);
    }
    return 0;
}

如果您希望数字正确以10个空格宽度对齐,以便所有输出值正确对齐,请改用%10d格式。

如果输入大数字或太多项目,最终将超出int类型的范围。您可以尝试增加变量[{1}}和square的范围,方法是{@ 1}}或者甚至是PeterJ sum的注释,并允许计算更大的值:< / p>

long long int

请注意,unsigned long long int将转换为int main(void) { int num; unsigned long long square, sum = 0; while (scanf("%d", &num) == 1 && num != 0) { square = (long long)num * num; sum = square + sum; printf("%21llu\n", sum); } return 0; } ,其范围至少与正值一样大。

答案 1 :(得分:0)

使用未初始化的变量会导致未定义的行为。您在while循环中使用未初始化的局部变量numnum可以包含任何价值。如果该值小于0,则循环将永远运行。如果使用scanf输入小于0的值,它也会循环播放。

对于未定义的行为,请检查标准的行 6.3.2.1左值,数组和函数指示符

  

如果左值指定一个自动存储持续时间的对象   可以用寄存器存储类声明(从来没有   它的地址),并且该对象未初始化(未声明   使用初始化程序并且之前未执行任何赋值   使用),行为未定义。

答案 2 :(得分:-2)

我希望,这可能有助于结束循环

#include <stdio.h>

int main() {    
int num = 0; 
int sum = 0;

while (num >= 0) {     
     scanf("%d", &num);
   if (num>=0) {
     sum = ( num * num ) + sum; 
     printf("          %d\n", sum);
   }
}
return 0;
}