为何含clrscr()与逗号运算符的相似C程序一个报错一个正常?
为什么
clrscr()位置不同会导致程序报错? 这事儿本质是C语言不同标准对变量声明位置的要求差异,结合你用的老编译器(毕竟clrscr()和getch()都是Turbo C这类老式编译器里的函数)来解释就清楚了:
核心原因:C89标准的变量声明规则
咱们先看你给出的错误代码里的关键行:
void main() { clrscr(), int a,b,c; ... }
在老的C89(ANSI C)标准里,有个严格的规定:代码块(比如main()的大括号内部)里的所有变量声明,必须放在任何执行语句的前面。
而clrscr()是一个函数调用,属于「执行语句」——它会执行清屏的操作。错误代码里把这个执行语句放在了变量a,b,c的声明前面,直接违反了C89的规则,编译器自然会抛出语法错误。
再看能正常运行的代码:
void main() { int a,b,c; clrscr(), printf("Enter the numbers"); ... }
这里先完成了所有变量的声明,再调用clrscr()执行清屏操作,完全符合C89的要求,所以编译器能正常处理,程序也能跑起来。
额外的语法问题:逗号运算符的误用
错误代码里用逗号把clrscr()和变量声明连在一起也是问题——逗号运算符,只能用来连接表达式,而变量声明属于声明语句,不是表达式,这种写法本身就是语法错误,这也会让编译器直接报错。
补充:C99及之后的变化
如果是用支持C99或更高版本的编译器(比如GCC),其实允许在代码块中间随时声明变量,哪怕前面有执行语句也没问题。但因为clrscr()是Turbo C这类老编译器专属的函数,这类编译器大多只支持C89,所以才会出现这种位置不同就报错的情况。
内容的提问来源于stack exchange,提问作者Ronak Sahay
相关产品推荐
相关产品推荐

