你如何区分 C 中的零和未初始化?

How do you differentiate between zero and not-initialised in C?

如何检查值是否为零或未给出?

int points[3];
points[0]=1;
points[1]=0;

for(int i=0;i<sizeof(points)/sizeof(*points);i++){

    if(points[i]&&points>0){printf("Value is %d \n",points[i]);}
    else if(!points[i]){printf("Value is zero \n");}
    else{printf("Not set/provided\n");} // catching points[2]
}

这里,如何区分points[1]points[2]

“你如何区分零和未设置”和“你如何区分点[1]和点[2]”是一种误解。 points[2] 在这种情况下没有初始化也没有分配。未指定为任何合法值。

if(points[i] ... 是 UB 当 i==2.

阅读前分配points[2]


How do you differentiate between zero and not-initialised in C?

代码通过跟踪先前初始化或分配的元素来做到这一点。在这种情况下,只分配了 points[0], points[1]。代码不会尝试通过读取 points[i].

来区分

一个常见的习惯用法是先用零填充整个对象:

int points[3] = { 0 };

没有初始化就没有通用的方法。 在某些情况下比如vs中的调试模式,它们会被初始化为零,但一般情况下,c或c++引擎会将随机值设置为未初始化的变量。

您需要做的事情如下:

int points[3] = {1, 0, -1};

for (int i = 0; i < 3; i++)
{
    if (points[i] > 0) printf("value: %d", points[i]);
    else if (points[i] == 0) printf("value is zero");
    else printf("value is not setted.");
}

C 没有找到未初始化值的功能。如果未初始化的变量是静态的或全局的,它的值将始终为 0,否则它可以是变量类型范围内的任何值。您可以做的是分配一个标记值作为指标。

例如,如果您确定变量的值始终为正,那么您可以分配一个负数来跟踪变量是否发生变化