我的问题是,在下面的程序中,代码如何
while (scanf("%d %d", &a, &b), (a || b))
正在评估中?
程序得到两个数字并打印总和:
int a, b;
while (scanf("%d %d", &a, &b), (a || b))
printf("%d\n", a + b);
答案 0 :(得分:2)
阅读有关C及其standard library。
的更多文档首先仔细阅读 scanf的文档。
然后阅读comma operator ,
和logical operators(例如||
和&&
)
此外,使用所有警告编译您的代码&调试信息(gcc -Wall -g
)并在调试器(gdb
)中逐步运行。这会让你对计算机运行代码的方式有一些(部分)直觉。
不要忘记阅读undefined behavior,特别是C.Lattner的博客:What every C programmer should know about undefined behavior。
更好的代码可能是:
int a, b;
while ((a=b=0), (scanf("%d %d", &a, &b)==2) && (a || b))
printf("%d\n", a + b);
答案 1 :(得分:1)
程序有一个逻辑错误 - 输入少于两个数字并关闭流将使程序进入无限循环。如果在第一次迭代时关闭流,则还会得到未定义的行为,因为在写入之前将会读取a
或b
。
原因是comma ,
operator放弃了评估其第一个操作数的结果:
while (scanf("%d %d", &a, &b), (a || b))
将致电scanf("%d %d", &a, &b)
,并继续评估a || b
,无论结果如何。这是不正确的,因为scanf
可能会在读取两个整数之前返回流已结束的指示。
编写此程序的更好方法如下:
while ((scanf("%d %d", &a, &b) == 2) && (a || b))
这也更直观,因为&&
比逗号更突出。
注意: a || b
与a != 0 || b != 0
的含义相同,即a
或b
中至少有一个非零。
答案 2 :(得分:0)
如何运行:
如果用户输入两个整数,它将打印这两个整数的总和,
并要求两个下一个输入,直到用户输入两个零整数,
如果用户不输入像aaa
这样的整数值,它将打印以前的a+b
值和循环,而不会询问新输入!
因此错误代码:
int32_t
的{{1}}等系统无关类型我的推荐样本:
#include<stdint.h>
终端输出(+输入):
#include<stdint.h>
#include<stdio.h>
int main()
{
int32_t a, b;
do{
if (scanf("%d%d", &a, &b) != 2) {
printf("incorrect input\n");
return 1;
}
printf("%d + %d = %d\n", a, b, a + b);
} while (a || b);
return 0;
}