C语言中变量初始化与赋初值有什么不同?
展开全部
所谓初始化,就是指系统(程序)起始状态时,各种参数(变量)应该取什么样的值,因为系统在reset时,内存数据可能不定,所以需要在程序开始时进行初始化(变量赋值,控制寄存器赋值配置等)。
赋初值一般指定义一个变量的同时就赋值。
其实,“变量初始化”和“赋初值”只是2种说法,目的都差不多,不必太“纠结”这两个词。
下面是一个mainLoop的结构,当然也可以不用Loop,具体根据你的程序用处决定
/*一般需要初始化的变量都是全局变量 定义变量var2 */
uint16 var2; /*此处var2,仅仅分配了内存空间2字节,但是没有赋初值,所以var2的具体值是多少不清楚,但是根据编译器的不同有些编译器会自动赋初值0或其他*/
void sysinit(void){
.......
var2 = 0; /* 根据要求对变量var2初始化*/
.......
}
main(){
uint16 var1=0; /*此处var1赋初值*/
sysinit(); /*此处可以对var2变量初始化赋值*/
for(;;){
task1();
.....
taskx();
}
}
刚刚看了“幻の上帝”的回答,似乎也没能说清“初始化”和“赋初值”的区别,只是用“微妙”形容了一下。
关于指出的2点错误,再此首先表示感谢,下面是我的答复:
1.指出“局部auto变量”在我上述论述中,首先并没有提到。再者,“局部auto变量”本身的特性就是在函数调用时才临时分配(一般分配在堆栈中),函数退出时释放。所以,局部auto变量要在函数调用时才能被初始化,这个说法有点“说了也白说”的感觉。而且我也并没有提到适用于“局部auto变量”。既然说到这里了,顺便提一下慎用“static局部变量”,首先就是长期占用(函数退出时也占用,不释放);其次,降低程序的可读性(多次调用这个函数时,如果开始不对其赋初始值[有点废话的感觉],那么就往往弄不清static局部变量的值)。
2.既然我也提到了和编译器有关,我也没有说一定是0或不是0,只是要根据编译器,目的是为了解释为什么要进行“初始化”的初衷,如果为了讨论各种编译器的标准的话,那我再此先谢谢你提供的消息,但是我觉得没有必要去纠结这些标准,我们只要养成良好的编程习惯,记得定义完变量后,进行“赋初值”或“初始化”,就OK了,这样就不会去争论编译器自动赋什么初值。再者C编译器也好C的标准也好,都也在不断的更新。所以我认为我上面的说法也并没有什么错误。
赋初值一般指定义一个变量的同时就赋值。
其实,“变量初始化”和“赋初值”只是2种说法,目的都差不多,不必太“纠结”这两个词。
下面是一个mainLoop的结构,当然也可以不用Loop,具体根据你的程序用处决定
/*一般需要初始化的变量都是全局变量 定义变量var2 */
uint16 var2; /*此处var2,仅仅分配了内存空间2字节,但是没有赋初值,所以var2的具体值是多少不清楚,但是根据编译器的不同有些编译器会自动赋初值0或其他*/
void sysinit(void){
.......
var2 = 0; /* 根据要求对变量var2初始化*/
.......
}
main(){
uint16 var1=0; /*此处var1赋初值*/
sysinit(); /*此处可以对var2变量初始化赋值*/
for(;;){
task1();
.....
taskx();
}
}
刚刚看了“幻の上帝”的回答,似乎也没能说清“初始化”和“赋初值”的区别,只是用“微妙”形容了一下。
关于指出的2点错误,再此首先表示感谢,下面是我的答复:
1.指出“局部auto变量”在我上述论述中,首先并没有提到。再者,“局部auto变量”本身的特性就是在函数调用时才临时分配(一般分配在堆栈中),函数退出时释放。所以,局部auto变量要在函数调用时才能被初始化,这个说法有点“说了也白说”的感觉。而且我也并没有提到适用于“局部auto变量”。既然说到这里了,顺便提一下慎用“static局部变量”,首先就是长期占用(函数退出时也占用,不释放);其次,降低程序的可读性(多次调用这个函数时,如果开始不对其赋初始值[有点废话的感觉],那么就往往弄不清static局部变量的值)。
2.既然我也提到了和编译器有关,我也没有说一定是0或不是0,只是要根据编译器,目的是为了解释为什么要进行“初始化”的初衷,如果为了讨论各种编译器的标准的话,那我再此先谢谢你提供的消息,但是我觉得没有必要去纠结这些标准,我们只要养成良好的编程习惯,记得定义完变量后,进行“赋初值”或“初始化”,就OK了,这样就不会去争论编译器自动赋什么初值。再者C编译器也好C的标准也好,都也在不断的更新。所以我认为我上面的说法也并没有什么错误。
展开全部
C语言中应该没有区别吧,在面向对象的程序设计语言中往往会有区别。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
语法上的初始化是指对象定义时,对应的分配空间之后对于值的操作。C语言中,静态和全局变量默认置0,有初始化列表的复制初始化列表的值到空间(如有不足,剩余部分置0),局部自动变量可以不初始化(调试器参与时可能被隐式地初始化为其它的值("debug magic number"),例如默认情况下Microsoft C/C++ Debugger会把栈中未初始化的字节置为0xCC)。
赋初值一般而言是指逻辑意义上的初始化。在C语言中,由于初始化的语法是“=”后加初值,所以“赋初值”基本上就是指语法上的初始化。不过随着语言的发展,“赋初值”的意义发生了扩大。对有构造语义但又允许不初始化而不产生编译错误的程序设计语言而言,两者有些微妙的差别。例如C++的构造函数中,用若干个成员名和括号括起来的初始化值构成的初始化列表是语法上的初始化(也可能是逻辑意义上的初始化,如果没有被构造函数体内的值覆盖),而构造函数体中对成员的赋值语句是逻辑上的初始化但不是语法上的初始化。
冰的悸动 错误:
1.“程序开始时进行初始化”的说法仅仅适用于静态或全局变量,而不适于局部自动变量。局部自动变量在函数调用时才能被初始化。
2.“但是根据编译器的不同有些编译器会自动赋初值0或其他”——这在ISO/IEC C语言标准中不是由实现定义的行为,如果一个编译器符合标准,那么行为就是明确的,即视此初始化的对象是否为全局对象来判断隐式初始化置0还是不进行初始化——从下面的函数定义来看这里应该var2是全局变量,会被置0。非标准编译器则另当别论(但是我还没见过会在这点上没事找茬的)。
赋初值一般而言是指逻辑意义上的初始化。在C语言中,由于初始化的语法是“=”后加初值,所以“赋初值”基本上就是指语法上的初始化。不过随着语言的发展,“赋初值”的意义发生了扩大。对有构造语义但又允许不初始化而不产生编译错误的程序设计语言而言,两者有些微妙的差别。例如C++的构造函数中,用若干个成员名和括号括起来的初始化值构成的初始化列表是语法上的初始化(也可能是逻辑意义上的初始化,如果没有被构造函数体内的值覆盖),而构造函数体中对成员的赋值语句是逻辑上的初始化但不是语法上的初始化。
冰的悸动 错误:
1.“程序开始时进行初始化”的说法仅仅适用于静态或全局变量,而不适于局部自动变量。局部自动变量在函数调用时才能被初始化。
2.“但是根据编译器的不同有些编译器会自动赋初值0或其他”——这在ISO/IEC C语言标准中不是由实现定义的行为,如果一个编译器符合标准,那么行为就是明确的,即视此初始化的对象是否为全局对象来判断隐式初始化置0还是不进行初始化——从下面的函数定义来看这里应该var2是全局变量,会被置0。非标准编译器则另当别论(但是我还没见过会在这点上没事找茬的)。
参考资料: 原创
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询