[英]Expression evaluation in C
while ((x[num++] = getchar()) != ' ');
这一次读取一个字符并在遇到空格时停止。 但是它如何评估带有空格的括号呢? 括号的结果是什么? 所以基本上,这( x[num++] = getchar()
)等于什么,以便将其与空格进行比较?
我在我的一本 class 书中找到了这个例子,它是不同的,我收到了一个警告,所以我想这是一个不好的做法,是吗? go这里怎么评价? 它是否首先将读取值分配给x[num]
然后将其与空间进行比较?
while(x[num++] = getchar() != ' ');
在 C 中, a = b
是一个表达式。 它将b
分配给a
,然后返回a
。 因此,while循环中的条件意味着:
getchar()
获取用户的输入getchar
的结果分配给x[num]
。num
增加 1x[num]
是否不等于空格' '
。IE
while (true) {
x[num] = getchar();
num ++;
if (!(x[num] != ' '))
break;
}
第二个示例具有完全不同的行为。 这是因为!=
表达式将在不带括号的赋值=
之前计算。 因此,第二个例子意味着
getchar()
获取用户的输入x[num]
是否不等于空格' '
。true
或false
)分配给x[num]
num
增加 1 警告是因为很容易错误地将while (a = b)
写成表示while (a == b)
。
这两个版本都不是好的编码; 两者都忽略了在读取空间之前到达 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.