我的问题是在下面的程序中,代码如何

while (scanf("%d %d", &a, &b), (a || b))


正在评估中?

程序得到两个数字并打印总和:

int a, b;
while (scanf("%d %d", &a, &b), (a || b))
    printf("%d\n", a + b);

最佳答案

程序存在逻辑错误-输入少于两个数字并关闭流将使程序进入无限循环。如果在第一次迭代时关闭流,则还会得到未定义的行为,因为ab将在写入之前被读取。

这样做的原因是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相同,即ab中的至少一个不为零。

关于c - 工作原理:while(scanf(“%d%d”,&a,&b),(a || b)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38027068/

10-11 02:10