关于变量未赋初值时和“+”的使用本帖最后由 haoranhaoran 于 2013-04-03 00:59:44 编辑声明一个变量x后未
关于变量未赋初值时和“+=”的使用 本帖最后由 haoranhaoran 于 2013-04-03 00:59:44 编辑 声明一个变量x后未给它赋值时是什么状态?可以用x+=y吗? 未赋值int不是0吗 下面代码执行后会输出0
#include<stdio.h> void main() { int i; printf("%d",i); } 问题出在这里
#include<stdio.h> void main() { char a[10],b[10]; int d,e; gets(a); gets(b); for (int i=0;a[i]!='\0';i++) d+=a[i]; for (int i=0;b[i]!='\0';i++) e+=b[i]; int c = strcmp(a,b); printf("%d,%d,%d",c,d,e); } 我没给d,e赋初值 执行后输入 ab 回车 cd回车 结果是
-1,4810899,199
d的值异常 但e的值却正常这是怎么回事 (d赋初值0后一切正常)
而且这代码在tcc以外的编译器都提示出错 请问哪里不标准了?
我做了一些测试
#include<stdio.h> void main() { int i=100; for(int i;i<=10;i++) printf("%d ",i); printf("\n%d",i); } tcc会给
1 2 3 4 5 6 7 8 9 10
100
其他编译器如 VC++6.0,Dev-C++ 都出错
请问下面这句什么意思
引用 5 D:\test.c 'for' loop initial declaration used outside C99 mode 改成
#include<stdio.h> main() { int i=100; for(;i<=10;i++) printf("%d ",i); printf("\n%d",i); } 正常编译 输出
100
是不是C++编译器不100%兼容C关系
[解决办法] >未赋值int不是0吗
不是
[解决办法] 首先,建议楼主不要再做测试了,先去复习基础知识
编译器做不到完全符合语言标准,但语言标准是保证“所有编译器共通可用”的前提。基础知识不牢固,只是在各编译器上尝试各种情况的话,学不到正确的知识。
然后,未赋值的局部变量,当前数值取决于“这块内存被用于存放这个变量之前存放的数据”。
最后,C语言规定,函数内所使用的变量,必须在“第一行可执行语句”前全部定义完成。
[解决办法] 讨论不确定、未定义的因素对于程序员来说基本无意义,编程序就是要使不确定变得确定,并且要确保这种确定性。所以新的语言比如C#对于没有初始化的变量直接报错,记得VC也有警告。
[解决办法] 是没什么好讨论的,这状况只说明你还用着TC、VC6等较低版本的编译器,C99出台之前的产品,它们编译时对未初始化就使用变量没做严格检查,稍高一点的版本,如VC7.1及之后的版本都已经有对这种状况检查报错
其实用什么编译器都无所谓,只要你自己代码这种规定,就没有不可理喻的情况了
关于变量的定义位置,老的标准 "函数内所使用的变量,必须在“第一行可执行语句”前全部定义完成" 这条基本上废弃了,除C51里还保留,其它较新版编译器都改为“在使用前”完成定义
还是补习一下C99吧,C99之前的教课书有部分内容已经过时需要修正了
[解决办法] 引用: 声明一个变量x后未给它赋值时是什么状态?可以用x+=y吗? 1.声明未必是定义,定义一定是声明。 搜素一下ODR(one definition rule)
2.未初始化是什么状态?取决于变量的存储类型(static,local, global, register...)
[解决办法] 未定义产生的后果无法估计,豪无意义
[解决办法] 使用为定义的变量结果是未定义的。这非常危险,在高档一点的编译器它都会直接提示你的。