在C中是否需要变量声明?

时间:2018-10-17 10:13:48

标签: c

查看注释以查看被称为声明的内容。 如果缺少整个变量声明部分,那会是什么问题?

似乎可以像示例中那样同时或分别进行变量定义和初始化。

#include <stdio.h>

// Variable declaration:
extern int a, b;
extern int c;
extern float f;

int main () {

   /* variable definition: */
   int a, b;
   int c;
   float f;

   /* actual initialization */
   a = 10;
   b = 20;

   c = a + b;
   printf("value of c : %d \n", c);

   f = 70.0/3.0;
   printf("value of f : %f \n", f);

   return 0;
}

4 个答案:

答案 0 :(得分:2)

如果缺少该声明,则它将不会在main函数中造成任何问题,因为局部定义的变量a,b,c,f将在main的功能中使用,直到其作用域结束。 / p>

声明仅告诉您定义位于其他.c文件中的其他位置,或者该定义位于同一main文件中函数.c之后。

答案 1 :(得分:2)

如果缺少上述声明,这里将没有问题。

// Variable declaration:
extern int a, b;
extern int c;
extern float f;

这告诉编译器这些变量是在其他位置(在另一个文件中)定义的。

/* variable definition: */
int a, b;
int c;
float f;

在这里定义变量,但它们与声明的外部变量不同,因为它们在主函数的内部范围内。

作用域是变量所在的地方。 extern关键字指出范围是全局的。 您可以在内部范围内定义具有相同名称的变量,并像在main函数中那样仅访问它们,但这不是一个好习惯。

void foo()
{
    int a = 5;
    printf("%d\n", a); // 5

    // Creating an inner scope
    {
        int a = 20;
        printf("%d\n", a); // 20
    }
    printf("%d\n", a); // 5
}

extern关键字与变量一起使用的正确方法是这样的。

//h1.h
extern int global_var;  // Declaration of the variable

//c1.c
#include h1.h
int global_var = 0; // Definition of the global var. Memory is allocated here.

//main.c
#include h1.h
int main()
{
    printf("global var value is %d\n", global_var); // use of the var defined and 
                                                    // initialized in c1.c
    return 0;
}

由于该变量是在c1.c中定义和初始化的,因此该程序将打印0

答案 2 :(得分:1)

Extern扩展了C变量和C函数的可见性。这样一来,让编译器知道在另一个地方声明了这些var,并在其他地方为它们分配了内存。 例如在另一个c文件中。 例如,如果编译包含全局变量的c文件: 整数c = 5; 然后在使用此c var的c文件上创建一个函数,例如:

int someFunc(void){

return c;}

如果在主目录中运行someFunc并打印其返回值,将得到5。但是必须将两个c文件一起编译。 在程序中,您仅使用在主函数中声明的本地分配的var。

答案 3 :(得分:0)

当涉及简单变量时,声明和定义之间实际上没有区别。在结构和功能上有所不同。这是一个示例:

// Declarations
struct myStruct;
int foo();

int main() 
{
   ...
}

// Definitions
struct myStruct {
    int a, b;
};

int foo() {
    return 42;
}

在您的情况下,您将隐藏先前的声明,以便在作用域结束之前无法访问它们。这通常称为 shadowing 。基本上是这样:

int main()
{
    int i=0;
    printf("i: %d\n", i);
    {
        int i=42; // Now the previous i is inaccessible within this scope
        printf("i: %d\n", i);
    }
    // And now it is accessible again
    printf("i: %d\n", i);
}