C中的表达评估

时间:2011-07-04 16:06:31

标签: c operator-keyword getchar

while ((x[num++] = getchar()) != ' ');

一次读取一个char,如果遇到空格则停止。 但它如何用空间评估括号?括号的结果是什么?基本上,这个(x[num++] = getchar())等于什么,以便将它与空格进行比较?

我在我的一本课本中找到了这个例子,它有所不同,我收到了警告,所以我猜这是一个不好的做法吗?评估如何进行?它是否首先将读取值分配给x[num],然后将其与空间进行比较?

while(x[num++] = getchar() != ' ');

2 个答案:

答案 0 :(得分:3)

在C中,a = b表达式。它会将b分配给a,然后返回a。因此,while循环中的条件意味着:

  1. 致电getchar()以获取用户的输入
  2. getchar的结果分配给x[num]
  3. num增加1
  4. 检查x[num]是否不等于空格' '
  5. while (true) {
      x[num] = getchar();
      num ++;
      if (!(x[num] != ' '))
        break;
    }
    

    第二个例子有完全不同的行为。这是因为!=表达式将在赋值=之前进行求值而不带括号。因此,第二个例子意味着

    1. 致电getchar()以获取用户的输入
    2. 检查x[num]是否不等于空格' '
    3. 将步骤2中的结果(truefalse)分配给x[num]
    4. num增加1
    5. 警告是因为很容易误将while (a = b)写成while (a == b)

答案 1 :(得分:2)

这两个版本都不是很好的编码;两者都忽略了在读取空格之前达到EOF的可能性,并且在读取空格之前都忽略了溢出缓冲区的可能性。

第一个是正确的。它包含一项任务:

x[num++] = getchar()

分配的结果是分配的值。因此,如果getchar()返回'X',则赋值的结果为'X'。然后将赋值结果与空白进行比较;它们是不同的,循环重复。如果getchar()返回空白,则赋值的结果也是空白,空白等于空白,因此循环终止。

第二个是明显的错误。由于赋值的优先级低于!=,因此结果就像代码读取:

while (x[num++] = (getchar() != ' '))
    ;

也就是说,getchar()读取一个字符并与空白进行比较,如果该字符不是空白则生成值1,如果是空白则生成0。将此0或1分配给x[num++],然后将其评估为逻辑条件。如果结果为0,则循环终止;如果结果为1,则循环继续。请注意,读取的字符不会记录在此版本中 - 这就是编译器发出警告的原因。这几乎总是一个错误;在那些奇怪的情况下,当它不是一个错误时,你可以通过提供额外的括号来告诉编译器,使你的意图对于编译器 - 以及你的人类观众,其他将阅读你的代码的人清楚。 (请记住:如果你在6个月甚至6周内回来,你将成为一个与众不同的人,并且可能很难记住这些微妙之处。让每个人都明白。在过度教育之间有一个很好的平衡并且代码不足。)

代码应该是:

int c;
int max = sizeof(x) - 1;
int num = 0;

while ((c = getchar()) != EOF && num < max && (x[num++] = c) != ' ')
    ;

请特别注意,c必须是int而不是char