我的问题是在下面的程序中,代码如何
while (scanf("%d %d", &a, &b), (a || b))
正在评估中?
程序得到两个数字并打印总和:
int a, b;
while (scanf("%d %d", &a, &b), (a || b))
printf("%d\n", a + b);
最佳答案
程序存在逻辑错误-输入少于两个数字并关闭流将使程序进入无限循环。如果在第一次迭代时关闭流,则还会得到未定义的行为,因为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
中的至少一个不为零。关于c - 工作原理:while(scanf(“%d%d”,&a,&b),(a || b)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38027068/