C语言中的表达式求值
它一次读取一个字符,如果遇到空格则停止。 但是它如何用空格来计算括号呢?括号的结果是什么?那么基本上,为了将它与一个空格进行比较,这个(C语言中的表达式求值,c,operator-keyword,getchar,C,Operator Keyword,Getchar,它一次读取一个字符,如果遇到空格则停止。 但是它如何用空格来计算括号呢?括号的结果是什么?那么基本上,为了将它与一个空格进行比较,这个(x[num++]=getchar())等于什么 我在我的一本课堂教材中发现了这个例子,它是不同的,我得到了一个警告,所以我想这不是一个好的做法,是吗?这里的评估结果如何?它是否首先将读取值分配给x[num],然后将其与空格进行比较 while ((x[num++] = getchar()) != ' '); 在C中,a=b是一个表达式。它将b赋值给a,然后返回
x[num++]=getchar()
)等于什么
我在我的一本课堂教材中发现了这个例子,它是不同的,我得到了一个警告,所以我想这不是一个好的做法,是吗?这里的评估结果如何?它是否首先将读取值分配给x[num]
,然后将其与空格进行比较
while ((x[num++] = getchar()) != ' ');
在C中,
a=b
是一个表达式。它将b
赋值给a
,然后返回a
。因此,while循环中的条件意味着:
getchar()
获取用户的输入getchar
的结果分配给x[num]
num
增加1x[num]
是否不等于空格'
=代码>表达式将在赋值=
之前求值,不带括号。因此,第二示例意味着
调用getchar()
获取用户的输入
检查x[num]
是否不等于空格'
将步骤2中的结果(true
或false
)分配给x[num]
将num
增加1
警告是因为很容易错误地写而(a=b)
意味着而(a==b)
在C中,a=b
是一个表达式。它将b
赋值给a
,然后返回a
。因此,while循环中的条件意味着:
调用getchar()
获取用户的输入
将getchar
的结果分配给x[num]
将num
增加1
检查x[num]
是否不等于空格'
i、 e
第二个示例具有完全不同的行为。这是因为=代码>表达式将在赋值=
之前求值,不带括号。因此,第二示例意味着
调用getchar()
获取用户的输入
检查x[num]
是否不等于空格'
将步骤2中的结果(true
或false
)分配给x[num]
将num
增加1
警告是因为很容易将while(a=b)
误写为while(a==b)
两个版本都不是好的编码;两者都忽略在读取空间之前达到EOF的可能性,并且都忽略在读取空间之前缓冲区溢出的可能性
第一个在其他方面是正确的。它包含一项作业:
while (true) {
x[num] = getchar();
num ++;
if (!(x[num] != ' '))
break;
}
赋值的结果就是赋值。因此,如果getchar()。然后将赋值结果与空白值进行比较;它们是不同的,循环会重复。如果getchar()
返回一个空白,那么赋值的结果也是一个空白,空白等于空白,因此循环终止
第二个明显有缺陷。因为赋值的优先级低于=代码>,结果就像代码读取:
x[num++] = getchar()
也就是说,一个字符由getchar()
读取并与空白进行比较,如果该字符不是空白,则生成值1;如果该字符是空白,则生成值0。此0或1被分配给x[num++]
,然后作为逻辑条件进行计算。如果结果为0,则循环终止;如果结果为1,则循环将继续。请注意,此版本中未记录读取的字符-这就是编译器发出警告的原因。这几乎总是一个错误;在那些不是错误的奇怪情况下,您可以告诉编译器,通过提供额外的括号,让编译器——以及您的人类观众——阅读您的代码的其他人——清楚地了解您的意图。(记住:如果你在6个月甚至6周后回来,你将是一个不同的人,很可能很难记住这些微妙之处。让每个人都明白。在括号内的代码和括号内的代码之间有一个很好的平衡。)
代码可能应为:
while (x[num++] = (getchar() != ' '))
;
intc;
int max=sizeof(x)-1;
int num=0;
while((c=getchar())!=EOF&&num
特别要注意的是,c
必须是int
而不是char
这两个版本都不是好的编码;两者都忽略在读取空间之前达到EOF的可能性,并且都忽略在读取空间之前缓冲区溢出的可能性
第一个在其他方面是正确的。它包含一项作业:
while (true) {
x[num] = getchar();
num ++;
if (!(x[num] != ' '))
break;
}
赋值的结果就是赋值。因此,如果getchar()。然后将赋值结果与空白值进行比较;它们是不同的,循环会重复。如果getchar()
返回一个空白,那么赋值的结果也是一个空白,空白等于空白,因此循环终止
第二个明显有缺陷。因为赋值的优先级低于=代码>,结果就像代码读取:
x[num++] = getchar()
也就是说,一个字符由getchar()
读取并与空白进行比较,如果该字符不是空白,则生成值1;如果该字符是空白,则生成值0。此0或1被分配给x[num++]
,然后作为逻辑条件进行计算。如果结果为0,则循环终止;如果结果为1,则循环将继续。请注意,此版本中未记录读取的字符-这就是编译器发出警告的原因。几乎是因瓦里