【问题标题】:Can anyone tell the difference between these two code snippets in C?谁能说出这两个 C 代码片段之间的区别?
【发布时间】:2019-11-12 20:30:31
【问题描述】:

我是 C 编程新手,我正在使用 getchar() 练习 while 循环。但是我对这两个while循环代码感到困惑。 这是第一个代码:

char c;
c=getchar();
while(c != 'X')
  c=getchar();
printf("Thanks for finally inputting an X.\n");

我不明白这个函数会printf直到用户输入X。

这是第二个代码:

char c;
while((c=getchar()) != 'X');
printf("Thanks for finally inputting an X");

哪个和最后一个函数做了同样的事情,但是我不太明白while((c=getchar()) != 'X');对我来说意味着当用户输入除X之外的其他字符时,它会是真的并打印句子。

【问题讨论】:

  • 第二个句尾没有句号。
  • 而且它还缺少换行符,这在某些系统上问题更大

标签: c loops operators


【解决方案1】:

仔细看第二个sn-p中的while

char c;
//    here ----------------v
while((c=getchar()) != 'X');
printf("Thanks for finally inputting an X");

; 紧跟在 while 之后。这意味着循环的主体是空的。因此循环将继续运行该条件直到它为假,即当c 等于'X'

【讨论】:

    【解决方案2】:

    两种方法是等价的,但第二种更简洁,代码更少:

    评估条件(c = getchar()) != 'X')首先调用getchar()从标准输入读取一个字节,存储到c,顺便说一下应该定义为int,并将这个字节与@987654325进行比较@,继续循环,直到用户最终键入一个 X(后跟一个返回),因为 while 循环的主体是一个空语句。

    这种方法的主要问题是程序不测试EOF,因此如果标准输入到达文件末尾而没有读取X,它将执行代价高昂的无限循环。

    这是一个更好的选择:

    int c;
    while ((c = getchar()) != EOF) {
        if (c == 'X') {
            printf("Thanks for finally inputting an X\n");
            break;
        }
    }
    

    为了避免混淆语法while((c=getchar()) != 'X');,一些程序员会使用空块:

    while ((c = getchar()) != 'X') {
    }
    

    可能带有令人讨厌的评论:

    while ((c = getchar()) != 'X') {
        /* do nothing */
    }
    

    我个人更喜欢多余的continue

    while ((c = getchar()) != 'X')
        continue;
    

    另请注意,此句法问题也存在于其他受 C 启发的语言中:C++、java、javascript、C#、Objective C 等。

    【讨论】:

    • 感谢您的详细回答。
    【解决方案3】:

    这两个代码 sn-ps 在行为上是等价的。

    为了理解第二个sn-p,您需要记住,在这种情况下,内括号中存在的内容将首先被评估。

    所以,这个:

    while((c=getchar()) != 'X');
    

    会有表达式:

    c = getchar()
    

    首先评估。现在,如您所知,getchar 方法将被执行,接收用户输入的字符,并将其分配给变量c

    现在我们的表达式如下所示:

    while((c) != 'X');
    

    但由于c 只是一个字符,所以它周围的括号不再起作用,我们现在有:

    while(c != 'X')
    

    这和第一个代码sn-p中while循环的条件是一样的,你已经明白了。


    提示:阅读operators precedence,这将帮助您了解为什么需要括号 - 否则您会得到不同的,很可能不需要的行为。

    原因是!= 运算符的优先级高于赋值运算符。使用括号强加了我们想要的评估顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2018-06-12
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多