C语言两种for循环变量声明语法有何区别?教授称二者相同是否正确?
教授的说法并不正确,这两种for循环写法存在两个核心差异,并非完全相同:
- 变量作用域不同
第一种写法中,i定义在for循环外部的作用域,循环执行结束后i仍然可以正常访问,此时它的值为5。你可以在循环结束后直接打印i,代码可以正常运行:
int i; for(i=0;i<5;i++) { printf("Hello"); } printf("%d", i); // 运行正常,输出5
第二种写法中,i是在for循环的初始化语句中定义的,它的作用域仅限于for循环内部,循环结束后再访问i会直接触发编译错误:
for(int i=0;i<5;i++) { printf("Hello"); } printf("%d", i); // 编译报错,提示变量i未定义
- C标准兼容性不同
第一种写法兼容所有版本的C语言标准,即便是最老的C89/C90标准也支持,所有合规的C编译器都可以正常编译这段代码。
第二种写法是C99标准才新增的语法特性,如果你使用C89/C90标准编译(比如给gcc加上-std=c89参数),会直接报语法错误无法编译通过。
如果你的编译环境默认启用C99及以上标准,且循环结束后不需要再访问变量i,两种写法的运行效果没有区别,但从语法规则层面二者显然并不完全等价。
内容的提问来源于stack exchange,提问作者Sandeep Sahani
相关产品推荐
相关产品推荐

