中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言自動變量的類型有哪些及怎么用

發布時間:2022-02-24 16:21:16 來源:億速云 閱讀:246 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言自動變量的類型有哪些及怎么用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言自動變量的類型有哪些及怎么用”文章能幫助大家解決問題。

關鍵字auto

為了更清楚地表達你的意圖(例如,為了表明有意覆蓋一個外部變量定義,或者強調不要把該變量改為其他存儲類別),可以顯式使用關鍵字auto,如下所示:

int main(void)
{
  auto int plox;

關鍵字auto是存儲類別說明符(storage-class specifier)。auto關鍵字在C++中的用法完全不同,如果編寫C/C++兼容的程序,最好不要使用auto作為存儲類別說明符。

塊作用域無鏈接意味著只有在變量定義所在的塊中才能通過變量名訪問該變量(當然,參數用于傳遞變量的值和地址給另一個函數,但是這是間接的方法)。另一個函數可以使用同名變量,但是該變量是存儲在不同內存位置上的另一個變量。

變量具有自動存儲期意味著,程序在進入該變量聲明所在的塊時變量存在,程序在退出該塊時變量消失。原來該變量占用的內存位置現在可做他用。

嵌套快的情況

接下來分析一下嵌套塊的情況。塊中聲明的變量僅限于該塊及其包含的塊使用。

int loop(int n)
{
     int m;          // m in scope
     scanf("%d", &m);
     {
          int i;    // both m and i in scope
          for (i = m; i < n; i++)
               puts("i is local to a sub-blockn");
     }
     return m;     // m in scope, i gone
}

在上面的代碼中,i僅在內層塊中可見。如果在內層塊的前面或后面使用i,編譯器會報錯。通常,在設計程序時用不到這個特性。然而,如果這個變量僅供該塊使用,那么在塊中就近定義該變量也很方便。這樣,可以在靠近使用變量的地方記錄其含義。另外,這樣的變量只有在使用時才占用內存。變量nm分別定義在函數頭和外層塊中,它們的作用域是整個函數,而且在調用函數到函數結束期間都一直存在。

如果內層塊中聲明的變量與外層塊中的變量同名會怎樣?內層塊會隱藏外層塊的定義。但是離開內層塊后,外層塊變量的作用域又回到了原來的作用域。程序hiding.c演示了這一過程。

// hiding.c -- variables in blocks
#include <stdio.h>
int main()
{
    int x = 30;      // original x


    printf("x in outer block: %d at %pn", x, &x);
    {
        int x = 77;  // new x, hides first x
        printf("x in inner block: %d at %pn", x, &x);
    }
    printf("x in outer block: %d at %pn", x, &x);
    while (x++ < 33) // original x
    {
        int x = 100; // new x, hides first x
        x++;
        printf("x in while loop: %d at %pn", x, &x);
    }
    printf("x in outer block: %d at %pn", x, &x);


    return 0;
}

下面是該程序的輸出:

x in outer block: 30 at 0x7fff5fbff8c8
x in inner block: 77 at 0x7fff5fbff8c4
x in outer block: 30 at 0x7fff5fbff8c8
x in while loop: 101 at 0x7fff5fbff8c0
x in while loop: 101 at 0x7fff5fbff8c0
x in while loop: 101 at 0x7fff5fbff8c0
x in outer block: 34 at 0x7fff5fbff8c8

首先,程序創建了變量x并初始化為30,如第1條printf()語句所示。然后,定義了一個新的變量x,并設置為77,如第2條printf()語句所示。根據顯示的地址可知,新變量隱藏了原始的x。第3條printf()語句位于第1個內層塊后面,顯示的是原始的x的值,這說明原始的x既沒有消失也不曾改變。也許該程序最難懂的是while循環

while循環的測試條件中使用的是原始的x

while(x++ < 33)

在該循環中,程序創建了第3個x變量,該變量只定義在while循環中。所以,當執行到循環體中的x++時,遞增為101的是新的x,然后printf()語句顯示了該值。每輪迭代結束,新的x變量就消失。然后循環的測試條件使用并遞增原始的x,再次進入循環體,再次創建新的x。在該例中,這個x被創建和銷毀了3次。注意,該循環必須在測試條件中遞增x,因為如果在循環體中遞增x,那么遞增的是循環體中創建的x,而非測試條件中使用的原始x

我們使用的編譯器在創建while循環體中的x時,并未復用內層塊中x占用的內存,但是有些編譯器會這樣做。

該程序示例的用意不是鼓勵讀者要編寫類似的代碼(根據C的命名規則,要想出別的變量名并不難),而是為了解釋在內層塊中定義變量的具體情況。

沒有花括號的塊

前面提到一個C99特性:作為循環或if語句的一部分,即使不使用花括號({}),也是一個塊。更完整地說,整個循環是它所在塊的子塊(sub-block),循環體是整個循環塊的子塊。與此類似,if語句是一個塊,與其相關聯的子語句是if語句的子塊。這些規則會影響到聲明的變量和這些變量的作用域。程序forc99.c演示了for循環中該特性的用法。

// forc99.c -- new C99 block rules
#include <stdio.h>
int main()
{
    int n = 8;


    printf("   Initially, n = %d at %pn", n, &n);
    for (int n = 1; n < 3; n++)
        printf("      loop 1: n = %d at %pn", n, &n);
    printf("After loop 1, n = %d at %pn", n, &n);
    for (int n = 1; n < 3; n++)
    {
        printf(" loop 2 index n = %d at %pn", n, &n);
        int n = 6;
        printf("      loop 2: n = %d at %pn", n, &n);
        n++;
    }
    printf("After loop 2, n = %d at %pn", n, &n);


    return 0;
}

假設編譯器支持C語言的這個新特性,該程序的輸出如下:

Initially, n = 8 at 0x7fff5fbff8c8
loop 1: n = 1 at 0x7fff5fbff8c4
loop 1: n = 2 at 0x7fff5fbff8c4
After loop 1, n = 8 at 0x7fff5fbff8c8
loop 2 index n = 1 at 0x7fff5fbff8c0
loop 2: n = 6 at 0x7fff5fbff8bc
loop 2 index n = 2 at 0x7fff5fbff8c0
loop 2: n = 6 at 0x7fff5fbff8bc
After loop 2, n = 8 at 0x7fff5fbff8c8

需要注意的一點:

支持C99C11有些編譯器并不支持C99/C11的這些作用域規則(Microsoft Visual Studio 2012就是其中之一)。有些編譯會提供激活這些規則的選項。例如,撰寫本書時,gcc默認支持了C99的許多特性,但是要用–std=c99選項激活程序清單12.2中使用的特性:

gcc --std=c99 forc99.c

與此類似,gccclang都要使用–std=c1x-std=c11選項,才支持C11特性

程序forc99.c第1個for循環頭中聲明的n,其作用域作用至循環末尾,而且隱藏了原始的n。但是,離開循環后,原始的n又起作用了。

第2個for循環頭中聲明的n作為循環的索引,隱藏了原始的n。然后,在循環體中又聲明了一個n,隱藏了索引n。結束一輪迭代后,聲明在循環體中的n消失,循環頭使用索引n進行測試。當整個循環結束時,原始的n又起作用了。再次提醒讀者注意,沒必要在程序中使用相同的變量名。如果用了,各變量的情況如上所述。

自動變量的初始化

自動變量不會初始化,除非顯式初始化它。考慮下面的聲明:

int main(void)
{
  int repid;
  int tents = 5;

tents變量被初始化為5,但是repid變量的值是之前占用分配給repid的空間中的任意值(如果有的話),別指望這個值是0。可以用非常量表達式(non-constantexpression)初始化自動變量,前提是所用的變量已在前面定義過:

int main(void)
{
  int repid;
  int tents = 5;

關于“C語言自動變量的類型有哪些及怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炉霍县| 海晏县| 侯马市| 连山| 西林县| 子长县| 监利县| 余干县| 平乡县| 增城市| 石城县| 贵德县| 进贤县| 印江| 绍兴县| 普安县| 柳林县| 黑龙江省| 冷水江市| 岗巴县| 深泽县| 霍山县| 湟源县| 榆中县| 太和县| 安庆市| 葫芦岛市| 建湖县| 新宾| 两当县| 永平县| 宜都市| 武义县| 上高县| 昆山市| 泊头市| 饶河县| 息烽县| 兖州市| 高碑店市| 开江县|