#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个空格。
答案 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循环中使用未初始化的局部变量num
。 num
可以包含任何价值。如果该值小于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;
}