关于变量未赋初值时和“+=”的使用
本帖最后由 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++ 都出错
请问下面这句什么意思
改成
#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之前的教课书有部分内容已经过时需要修正了
[解决办法]
1.声明未必是定义,定义一定是声明。 搜素一下ODR(one definition rule)
2.未初始化是什么状态?取决于变量的存储类型(static,local, global, register...)
[解决办法]
未定义产生的后果无法估计,豪无意义
[解决办法]
使用为定义的变量结果是未定义的。这非常危险,在高档一点的编译器它都会直接提示你的。