C 变量集但未使用警告但也有错误未声明的标识符

C 变量集但未使用警告但也有错误未声明的标识符,c,scoping,undeclared-identifier,C,Scoping,Undeclared Identifier,调试器告诉我,我不使用变量,但它没有声明。这是怎么回事?if语句是否属于自己的范围?不知何故,似乎是固定长度的数组不在if块内的同一范围内 我的最小示例 #include <stdio.h> #include <stdlib.h> void nullarray(int start,int end, char array[]){ if(start<end) // TODO used to be <= { array[start]='0';

调试器告诉我,我不使用变量,但它没有声明。这是怎么回事?if语句是否属于自己的范围?不知何故,似乎是固定长度的数组不在if块内的同一范围内

我的最小示例

#include <stdio.h>
#include <stdlib.h>

void nullarray(int start,int end,  char array[]){
if(start<end) // TODO used to be <=
    {
    array[start]='0';
    nullarray(++start,end,array);
    }else{array[start]='\0';}

}


int main()
{
    int commaindex2=-1;
    int mostdecimaldigits=6;

      if(commaindex2==-1){
            char decimalnum2[1];decimalnum2[0]='0';
            }
    else{
    char decimalnum2[mostdecimaldigits]; // get enought store incl filling up zeros
    nullarray(0,mostdecimaldigits,decimalnum2); // write zeros to array

    }
     printf("%s", decimalnum2);
}
int main()
{
    int commaindex2=55;
    int mostdecimaldigits=6;
    int num;
      if(commaindex2==-1){
           num=1 ;
            }
    else{
   num=mostdecimaldigits;

    }
     char decimalnum2[num];
     nullarray(0,num,decimalnum2);
     printf("%s", decimalnum2);
}
但是这很好用

#include <stdio.h>
#include <stdlib.h>

void nullarray(int start,int end,  char array[]){
if(start<end) // TODO used to be <=
    {
    array[start]='0';
    nullarray(++start,end,array);
    }else{array[start]='\0';}

}


int main()
{
    int commaindex2=-1;
    int mostdecimaldigits=6;

      if(commaindex2==-1){
            char decimalnum2[1];decimalnum2[0]='0';
            }
    else{
    char decimalnum2[mostdecimaldigits]; // get enought store incl filling up zeros
    nullarray(0,mostdecimaldigits,decimalnum2); // write zeros to array

    }
     printf("%s", decimalnum2);
}
int main()
{
    int commaindex2=55;
    int mostdecimaldigits=6;
    int num;
      if(commaindex2==-1){
           num=1 ;
            }
    else{
   num=mostdecimaldigits;

    }
     char decimalnum2[num];
     nullarray(0,num,decimalnum2);
     printf("%s", decimalnum2);
}
这是怎么回事?if语句是否属于自己的范围

是-if语句(或者,准确地说,它后面的大括号)定义了它自己的范围,就像else语句后面的大括号一样(但这是一个不同的范围)

因此,您的声明
char decimalnum2[1]和<代码>字符小数点2[mostdecimaldigits]
(分别在
if
else
块中)定义变量(独立的、不相关的变量),这些变量仅在它们出现的括号内有效

因此,语句:
printf(“%s”,小数点m2),正试图使用未声明的变量-因此出现错误

此外,语句
decimalnum2[0]='0'
(在
if
块中)为(块本地)变量指定一个值,然后该变量将永远不会使用-因此出现警告


快速解决方案:您需要将
字符小数点m2[mostdecimaldigits]
if…else
块之前之外声明,并删除这些块内的两个声明。

正如UnholySheep指出的,C中有块作用域。这意味着变量在if块的}之后停止存在。因此,无法打印这些值


一组大括号开始了一个新的作用域,因此在您的第一段代码中,
decimalnum2
在两个不同的作用域中声明,一个在
if
块内,另一个在
else
块内。这两个变量都是不同的变量,一旦离开该范围,它们就不再存在


这就是为什么会出现警告和错误。您设置了变量,但没有在声明变量的范围内使用它,您试图在其范围外使用它。

“if语句是它自己的范围吗”-是的,从C99开始至少从C89开始,事实上,@UnholySheep。块作用域在C89中的描述方式与在C99中的描述方式非常相同。