App下載

C 中的變量作用域——解釋局部和全局作用域

被風(fēng)吹過(guò)灼思 2021-09-10 12:03:03 瀏覽數(shù) (2614)
反饋

在編程中,您經(jīng)常需要處理變量的作用域。變量的范圍決定了您是否可以在特定代碼塊內(nèi)訪問(wèn)和修改它。在本教程中,您將了解 C 編程語(yǔ)言中的變量作用域。您將看到一些代碼示例,以幫助您了解局部變量和全局變量之間的差異。

變量的作用域是什么?

在繼續(xù)了解局部和全局變量作用域之前,讓我們了解作用域的含義。

簡(jiǎn)單來(lái)說(shuō),變量的作用域就是它在程序中的生命周期。

這意味著變量的作用域是整個(gè)程序中變量被聲明、使用和可以修改的代碼塊。

在下一節(jié)中,您將了解變量的局部作用域

C 中變量的局部作用域——嵌套塊

在本節(jié)中,您將了解局部變量如何在 C 中工作。您將首先編寫(xiě)幾個(gè)示例,然后概括作用域原則。

? 這是第一個(gè)例子:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        //add 10 my_num
        my_num = my_num +10;
        //or my_num +=10 - more succinctly
        printf("my_num is %d",my_num);
    }
    
    return 0;
}

讓我們了解一下上面的程序是做什么的。

在 C 中,您用 {}分隔代碼塊。左花括號(hào)和右花括號(hào)分別表示塊的開(kāi)始和結(jié)束。

  • 該main()函數(shù)有一個(gè)整數(shù)變量my_num,它在外部塊中初始化為 7 。
  • 有一個(gè)內(nèi)部塊試圖將 10 添加到變量my_num。

現(xiàn)在,編譯并運(yùn)行上面的程序。這是輸出:

//Output

my_num is 17

您可以看到以下內(nèi)容:

  • 內(nèi)部塊能夠訪問(wèn)my_num在外部塊中聲明的值,并通過(guò)向其添加 7 來(lái)修改它。
  • 的值my_num現(xiàn)在是 17,如輸出中所示。

C 中變量的局部范圍——嵌套塊示例 2

? 這是另一個(gè)相關(guān)的例子:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        int new_num = 10;
    } 
    printf("new_num is %d",new_num); //this is line 9
    return 0;
}
  • 在這個(gè)程序中,main()函數(shù)my_num在外部塊中有一個(gè)整數(shù)變量。
  • 另一個(gè)變量new_num在內(nèi)部塊中初始化。內(nèi)部塊嵌套在外部塊內(nèi)。
  • 我們?cè)噲Dnew_num在外部塊中訪問(wèn)和打印內(nèi)部塊的值。

如果您嘗試編譯上面的代碼,您會(huì)注意到它沒(méi)有成功編譯。您將收到以下錯(cuò)誤消息:

Line   Message
9      error: 'new_num' undeclared (first use in this function)
這是因?yàn)樽兞縩ew_num是在內(nèi)部塊中聲明的,其作用域僅限于內(nèi)部塊。換句話說(shuō),它對(duì)于內(nèi)部塊是本地的,不能從外部塊訪問(wèn)。

基于上述觀察,讓我們寫(xiě)下以下變量局部作用域的通用原則:

{
	/*OUTER BLOCK*/
    
      {
    	
        
        //contents of the outer block just before the start of this block
        //CAN be accessed here
        
        /*INNER BLOCK*/
        
        
      }
     
       //contents of the inner block are NOT accessible here
 }

C 中變量的局部作用域——不同的塊

在前面的示例中,您了解了如何無(wú)法從塊外部訪問(wèn)嵌套內(nèi)部塊中的變量。

在本節(jié)中,您將了解在不同塊中聲明的變量的局部作用域。

#include <stdio.h>

int main()
{
    int my_num = 7;
    printf("%d",my_num);
    my_func();
    return 0;
}

void my_func()
{
    printf("%d",my_num);
}

在上面的例子中,

  • 整型變量my_num在main()函數(shù)內(nèi)部聲明。
  • 在main()函數(shù)內(nèi)部,my_num打印出的值。
  • 還有另一個(gè)函數(shù)my_func()試圖訪問(wèn)和打印 my_num的值。
  • 當(dāng)程序從main()函數(shù)開(kāi)始執(zhí)行時(shí),會(huì)調(diào)用到函數(shù)my_func()內(nèi)部main()。

? 現(xiàn)在編譯并運(yùn)行上述程序。您將收到以下錯(cuò)誤消息:

Line   Message
13     error: 'my_num' undeclared (first use in this function)

如果您注意到 on line 13,該函數(shù)my_func()嘗試訪問(wèn)在my_num函數(shù)內(nèi)部聲明和初始化的main()變量。

因此,變量的作用域my_num被限制在main()函數(shù)內(nèi),被稱(chēng)為函數(shù)局部的main()。

我們可以將這種局部作用域的概念一般性地表示如下:

{

	/*BLOCK 1*/
    // contents of BLOCK 2 cannot be accessed here
    
}


{

	/*BLOCK 2*/
    // contents of BLOCK 1 cannot be accessed here
    
}

C 中變量的全局范圍

到目前為止,您已經(jīng)了解了 C 變量的局部作用域。在本節(jié)中,您將學(xué)習(xí)如何在 C 中聲明全局變量。

? 讓我們從一個(gè)例子開(kāi)始。

#include <stdio.h>
int my_num = 7;

int main()
{
    printf("my_num can be accessed from main() and its value is %d\n",my_num);
    //call my_func
    my_func();
    return 0;
}

void my_func()
{
  printf("my_num can be accessed from my_func() as well and its value is %d\n",my_num);
}

在上面的例子中,

  • 該變量my_num在函數(shù)main()和之外聲明my_func()。
  • 我們嘗試訪問(wèn)函數(shù)my_num內(nèi)部main(),并打印其值。
  • 我們?cè)诤瘮?shù)my_func()內(nèi)部調(diào)用main()函數(shù)。
  • 該函數(shù)my_func()還嘗試訪問(wèn) 的值my_num,并將其打印出來(lái)。

該程序編譯沒(méi)有任何錯(cuò)誤,輸出如下所示:

//Output
my_num can be accessed from main() and its value is 7
my_num can be accessed from my_func() as well and its value is 7

在這個(gè)例子中,有兩個(gè)函數(shù) -main()和my_func()。

然而,該變量my_num不在兩個(gè)這兩個(gè)函數(shù)中。這種對(duì)任何函數(shù)都不是局部的變量被稱(chēng)為具有全局作用域,稱(chēng)為全局變量。

這個(gè)全局變量作用域的原理可以總結(jié)如下:

//all global variables are declared here
function1()
	{
    
    // all global variables can be accessed inside function1
    
    }
function2()
	{
    
    // all global variables can be accessed inside function2
     
    }
    



C

0 人點(diǎn)贊