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

这一次读取一个字符并在遇到空格时停止。但是它如何评估带有空格的括号呢?括号的结果是什么?所以基本上,x[num++] = getchar()为了将它与空间进行比较,这个 ( ) 等于什么?

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

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

2 回答 2

3

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

  1. 调用getchar()以获取用户的输入
  2. 将结果分配getcharx[num]
  3. 增加num1
  4. 检查是否x[num]不等于空格' '

IE

while (true) {
  x[num] = getchar();
  num ++;
  if (!(x[num] != ' '))
    break;
}

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

  1. 调用getchar()以获取用户的输入
  2. 检查是否x[num]不等于空格' '
  3. 将步骤 2 (truefalse) 中的结果分配给x[num]
  4. 增加num1

警告是因为很容易误写while (a = b)为 mean while (a == b)

于 2011-07-04T16:09:25.667 回答
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必须是 aint而不是 a char

于 2011-07-04T16:20:27.327 回答