C语言中变量初始化与赋初值有什么不同?
答案:4 悬赏:80 手机版
解决时间 2021-01-27 11:31
- 提问者网友:捧腹剧
- 2021-01-26 20:24
C语言中变量初始化与赋初值有什么不同?
最佳答案
- 五星知识达人网友:笑迎怀羞
- 2021-01-26 21:16
语法上的初始化是指对象定义时,对应的分配空间之后对于值的操作。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。非标准编译器则另当别论(但是我还没见过会在这点上没事找茬的)。
全部回答
- 1楼网友:毛毛
- 2021-01-26 22:29
c语言中,变量只有先声明,才能使用,这样避免编程时产生不必要的错误,一位不同类型变量的存储格式和长度都不同,所以字节长度不同,声明变量可以让计算机知道你更需要用什么样的格式存储变量,从而高效稳定地运行程序。
初始化变量的原因,是因为一个变量光定义的话,只会为它分配一个内存空间,但是具体的数值是不确定的,如果你不初始化(也就是赋初值),你拿什么去参与的运算操作,不得而知,运算的结果肯定要有问题。
变量是指在程序的运行过程中随时可以发生变化的量。
变量是程序中数据的临时存放场所。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。由于变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。变量可以保存程序运行时用户输入的数据(如使用inputbox函数在屏幕上显示一个对话框,然后把用户键入的文本保存到变量中)、特定运算的结果以及要在窗体上显示的一段数据等。简而言之,变量是用于跟踪几乎所有类型信息的简单工具。
- 2楼网友:渡鹤影
- 2021-01-26 22:15
C语言中应该没有区别吧,在面向对象的程序设计语言中往往会有区别。
- 3楼网友:野味小生
- 2021-01-26 21:33
所谓初始化,就是指系统(程序)起始状态时,各种参数(变量)应该取什么样的值,因为系统在reset时,内存数据可能不定,所以需要在程序开始时进行初始化(变量赋值,控制寄存器赋值配置等)。
赋初值一般指定义一个变量的同时就赋值。
其实,“变量初始化”和“赋初值”只是2种说法,目的都差不多,不必太“纠结”这两个词。
下面是一个mainLoop的结构,当然也可以不用Loop,具体根据你的程序用处决定
uint16 var2;
void sysinit(void){
.......
var2 = 0;
.......
}
main(){
uint16 var1=0;
sysinit();
for(;;){
task1();
.....
taskx();
}
}
刚刚看了“幻の上帝”的回答,似乎也没能说清“初始化”和“赋初值”的区别,只是用“微妙”形容了一下。
关于指出的2点错误,再此首先表示感谢,下面是我的答复:
1.指出“局部auto变量”在我上述论述中,首先并没有提到。再者,“局部auto变量”本身的特性就是在函数调用时才临时分配(一般分配在堆栈中),函数退出时释放。所以,局部auto变量要在函数调用时才能被初始化,这个说法有点“说了也白说”的感觉。而且我也并没有提到适用于“局部auto变量”。既然说到这里了,顺便提一下慎用“static局部变量”,首先就是长期占用(函数退出时也占用,不释放);其次,降低程序的可读性(多次调用这个函数时,如果开始不对其赋初始值[有点废话的感觉],那么就往往弄不清static局部变量的值)。
2.既然我也提到了和编译器有关,我也没有说一定是0或不是0,只是要根据编译器,目的是为了解释为什么要进行“初始化”的初衷,如果为了讨论各种编译器的标准的话,那我再此先谢谢你提供的消息,但是我觉得没有必要去纠结这些标准,我们只要养成良好的编程习惯,记得定义完变量后,进行“赋初值”或“初始化”,就OK了,这样就不会去争论编译器自动赋什么初值。再者C编译器也好C的标准也好,都也在不断的更新。所以我认为我上面的说法也并没有什么错误。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯