c語言自動變量的潛在問題,c語言中的自動變量

本文目錄一覽:

關於c語言auto變量和static變量區別

auto是自動變量,在C語言中編譯器已給不加關鍵字的定義默認為自動變最,即auto,因此在實際中沒必要加。static是靜態變量,即該變量不會改變,任何賦值都無效,有點類似預處理。

C語言中的自動變量和寄存器變量是什莫?

C語言學習之變量存儲

C語言中對變量的說明包括兩方面的內容:變量類型以及變量的存儲類型。變量類型如:int(整形),char(字符型)是用來說明變量所佔用的內存空間的大小。變量存儲類型用來說明變量的作用範圍。

C語言的變量存儲類有:自動類、寄存器類、靜態類和外部類。

關鍵字auto加在變量名及其類型前,用來說明它是自動變量。局部變量是指在函數內部說明的變量(有時也稱為自動變量)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變量都被認為是局部變量, 所以auto實際上 從來不用。 局部變量在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這個變量也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自動消失。

static稱為靜態變量。根據變量的類型可以分為靜態局部變量和靜態全程變量。

1. 靜態局部變量

它與局部變量的區別在於: 在函數退出時, 這個變量始終存在, 但不能被其它

函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變量一樣。

2. 靜態全程變量

靜態 全程變量就是指只在定義它的源文件中可見而在其它源文件中不可見的變量。它與

全程變量的區別是: 全程變量可以再說明為外部變量(extern), 被其它源文件使用,而靜態全程變量卻不能再被說明為外部的, 即只能被所在的源文件使用。

extern稱為外部變量。為了使變量除了在定義它的源文件中可以使用外, 還要 被其它文件使用。因此, 必須將全程變量通知每一個程序模塊文件, 此時可用 extern來說明。

寄存器變量to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程序把該變量放在一個CPU寄存器中。因為數據在寄存器中操作比在內存中快,這樣就提高了程序代碼的執行速度。寄存器變量的說明是在變量名及類型之前加上關鍵字register。值得注意的是取地址運算符不能作用於寄存器變量。

file1.c

#include stdlib.h

#include stdio.h

int reset();

int next();

int last();

int sum(int );

int i=1;

void main()

{

auto int i,j;

i=reset();

for(j=1;j=3;j++)

{

printf(“i=%d\tj=%d\n”,i,j);

printf(“next(i)=%d\n”,next());

printf(“last(i)=%d\n”,last());

printf(“sum(i+j)=%d\n”,sum(i+j));

}

}

file2.c文件

static int i=10;

int next()

{

return(i+=1);

}

int last()

{

return(i-=1);

}

int sum(int i)

{

static int j=5;

return(i=j+=i);

}

file3.c文件

extern int i;

reset()

{

return(i);

}

運行結果:

i=1 j=1

next(i)=11

last(i)=10

sum(i+j)=7

i=1 j=2

next(i)=11

last(i)=10

sum(i+j)=10

i=1 j=3

next(i)=11

last(i)=10

sum(i+j)=14

具體分析一下三個文件中的變量的種類。

在file1.c的開頭聲明i是外部變量,並出示化為1。而在main函數內部,說明了兩個自動變量i和j,這樣在main內部出現的i就是自動量。在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同一個變量,所以reset的值返回的就是這個i的當前值1。file2.c文件已開始就定義了變量i,並聲明為靜態變量,因此它的使用範圍只在當前文件中使用。然而從函數sum中定義來看,其內部用到的i是形式參數,j是內部靜態變量,它們與以前的i,j都不同。

具體執行過程分析如下:

首先程序經過編譯後聲稱可執行文件,運行可執行文件後,函數從Main函數體進入,在初始化的過程中得到i為全局變量,初值為1。進入main函數後首先調用函數reset(),進入文件file3.c,文件file3.c聲明i為外部變量,所以此時i的值為1,則返回的值為1。函數reset()執行完後返回主函數,繼續執行循環體中的程序。循環體首先調用函數next(),程序進入file2.c文件,判斷i為靜態變量,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當調用last()函數時,判斷i的值為11,執行函數後,i的值變為10,並將10作為i的值。最後執行函數sum(i),此時值的注意的是執行程序時傳遞的是形參,即第一次調用時實際計算的值為sum(i+j=2),這樣調用函數sum(i)後執行的結果為i=5+2=7,即為執行的結果。依次類推,分別為7,10,14。

通過以上的程序可以理解不同的存儲類型的作用範圍不同,在程序設計中如何靈活的使用各種不同的存儲類型是能夠使程序更靈活。

C語言的定義變量問題?

auto

(1)auto關鍵字在C語言中只有一個作用,那就是修飾局部變量。

(2)auto修飾局部變量,表示這個局部變量是自動局部變量,自動局部變量分配在棧上。(既然在棧上,說明它如果不初始化那麼值就是隨機的······)

(3)平時定義局部變量時就是定義的auto的,只是省略了auto關鍵字而已。可見,auto的局部變量其實就是默認定義的普通的局部變量。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/182352.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 06:20
下一篇 2024-11-24 06:20

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • int類型變量的細節與注意事項

    本文將從 int 類型變量的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變量進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變量。 一、定義與聲明 int…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示“文件中含有宏,保存將導致宏不可用”的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python input參數變量用法介紹

    本文將從多個方面對Python input括號里參數變量進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • Python匿名變量的使用方法

    Python中的匿名變量是指使用“_”來代替變量名的特殊變量。這篇文章將從多個方面介紹匿名變量的使用方法。 一、作為佔位符 匿名變量通常用作佔位符,用於代替一個不需要使用的變量。例…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29

發表回復

登錄後才能評論