cpu*_*uer 22 c initialization default-value
我正在阅读nginx的源代码并发现它没有初始化许多数值变量,包括ngx_int_t ngx_last_process;
,这里ngx_int_t
定义为long int
#if 0
ngx_last_process = 0;
#endif
Run Code Online (Sandbox Code Playgroud)
那么@Igor Sysoev认为没有必要进行初始化?
但是在程序中它假定默认值是0
:
for (s = 0; s < ngx_last_process; s++) {
if (ngx_processes[s].pid == -1) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
是否保证未初始化的变量0
在c中具有价值?
Wiz*_*Wiz 28
默认情况下,外部和静态变量初始化为零,这是有保证的.没有显式初始值设定项的自动和寄存器变量将具有不确定的值(未指定的值或陷阱表示).
来自标准:
C89
6.5.7:
如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个具有算术类型的成员都被赋值为0,并且每个具有指针类型的成员都被赋予空指针常量.如果未显式初始化具有自动存储持续时间的对象,则其值不确定.
C99
6.2.4,§5:
对于没有可变长度数组类型的对象,它的生命周期从entry进入与其关联的块,直到该块的执行以任何方式结束.(输入一个封闭的块或调用一个函数暂停,但不是结束,执行当前块.)如果以递归方式输入块,则每次都会创建该对象的新实例.对象的初始值是不确定的.如果为对象指定了初始化,则每次在执行块时达到声明时都会执行初始化; 否则,每次达到声明时,该值将变为不确定.
6.7.8,§10:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正向或未对齐)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
3.17.2,§1:
不确定值:未指定的值或陷阱表示
3.17.3,§1:
未指定的值:相关类型的有效值,其中本国际标准不对任何情况下选择的值施加任何要求.注意未指定的值不能是陷阱表示.
int
在文件范围声明(如 )的变量被初始化为 0。
例子
int i;
int main()
{
int x;
printf("%d",i); // prints 0
printf("%d",x); // prints some unspecified value
}
Run Code Online (Sandbox Code Playgroud)
是否保证未初始化的变量在 c 中的值为 0?
不!这不适用于在函数作用域中声明的变量。
归档时间: |
|
查看次数: |
16548 次 |
最近记录: |