这是如何工作的:while(scanf(“%d%d”,& a,& b),(a || b))

时间:2016-06-25 09:40:47

标签: c while-loop scanf

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

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

正在评估中?

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

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

3 个答案:

答案 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)

程序有一个逻辑错误 - 输入少于两个数字并关闭流将使程序进入无限循环。如果在第一次迭代时关闭流,则还会得到未定义的行为,因为在写入之前将会读取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 || ba != 0 || b != 0的含义相同,即ab中至少有一个非零。

答案 2 :(得分:0)

如何运行:
如果用户输入两个整数,它将打印这两个整数的总和,
并要求两个下一个输入,直到用户输入两个零整数,
如果用户不输入像aaa这样的整数值,它将打印以前的a+b值和循环,而不会询问新输入

因此错误代码

  1. 尝试尽可能简单地编写(组合C语句没有意义)
  2. 始终检查错误
  3. 在需要时使用来自int32_t的{​​{1}}等系统无关类型
  4. 初始化变量
  5. 我的推荐样本:

    #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;
    }