簡體   English   中英

C中是否需要變量聲明?

[英]Is variable declaration necessary in 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;
}

如果聲明丟失,那么它將在main函數中沒有問題,因為本地定義的變量,即a,b,c,f將用於main的功能,直到其范圍結束。

聲明只是告訴定義位於別處(在其他.c文件中)或定義位於同一.c文件中的函數main之后。

如果缺少上述聲明,這里就沒有問題了。

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

這告訴編譯器這些變量是在其他地方定義的(在另一個文件中)。

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

這是您定義變量的地方,但它們與您聲明的外部變量不同,因為它們位於main函數的內部范圍內。

范圍是變量存在的地方。 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

Extern擴展了C變量和C函數的可見性。 因此,讓編譯器知道有另一個地方聲明這些變量並在其他地方為它們分配了內存。 例如在另一個c文件中。 如果編譯包含全局變量的ac文件,例如:int c = 5; 並在您使用此c var的c文件上創建一個函數,例如:

int someFunc(void){

return c;}

如果你在main中運行someFunc並打印它的返回值,你將獲得5.但是你必須將兩個c文件一起編譯。 在您的程序中,您只使用在main函數中聲明的本地分配的var。

說到簡單變量,聲明和定義之間確實沒有區別。 結構和功能有所不同。 這是一個例子:

// Declarations
struct myStruct;
int foo();

int main() 
{
   ...
}

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

int foo() {
    return 42;
}

在您的情況下,您隱藏了以前的聲明,以便在作用域結束之前無法訪問它們。 這通常稱為陰影 它與此基本相同:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM