为何C语言布尔表达式中不允许变量声明?
为何C语言布尔表达式中不允许变量声明?
嘿,这个问题问得很到位!你遇到的其实是C语言语法规则里的一个明确限制,咱们一步步拆解清楚为什么你的修改行不通。
首先,C语言里while循环的括号内部要求的是一个表达式——也就是能产生一个值(用来判断真假)的代码片段。而变量声明(比如int c = getchar())属于语句范畴,语句是用来执行动作的,它不会产生可以被用来比较的值,所以根本没办法放在需要表达式的位置里。
你原来的代码while((c = getchar()) != EOF)是合法的,因为c = getchar()是一个赋值表达式——赋值操作本身会返回被赋予的值,所以整个表达式能产生一个int类型的值,接着就能和EOF做比较了。
那为啥你觉得逻辑上应该可行但实际不行呢?因为C语言的语法设计里,把表达式和语句严格区分开了:
- 表达式:有返回值,比如赋值运算、算术运算、比较运算这些都属于表达式
- 语句:没有返回值,用来完成具体操作,比如变量声明、
if分支、循环体、单独成行的函数调用等
如果想要在循环里声明变量同时完成判断,其实C99及以后的标准允许你用for循环来实现类似的效果,比如:
#include <stdio.h> int main(){ for (int c; (c = getchar()) != EOF; ) { putchar(c); } return 0; }
这是因为for循环的第一个位置(初始化部分)允许放语句(包括变量声明),而条件部分还是表达式,这样就完全符合语法规则了。
总结一下:不是你的逻辑有问题,而是C语言的语法不允许在需要表达式的地方(比如while的条件、if的判断条件里)放置变量声明这种语句。
备注:内容来源于stack exchange,提问作者Abhishek01s
相关产品推荐
相关产品推荐

