欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解

 更新時(shí)間:2022年07月06日 11:09:56   作者:龍兆萬(wàn)  
這篇文章主要解釋了c語(yǔ)言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法

1.auto

在解釋 auto 之前,先來了解一下什么是局部變量。

在很多印象中,對(duì)局部變量的描述是:函數(shù)內(nèi)定義的變量稱為局部變量。并且下面這段代碼也很好的解釋了這句話:

#include <stdio.h>
void print()
{
	int a = 10;
	printf("%d", a);
}
int main()
{
	print();
	printf("%d", a);
	return 0;
}

顯然這段代碼是錯(cuò)的,編譯器也會(huì)報(bào)錯(cuò):

但事實(shí)上 “函數(shù)內(nèi)部定義的變量是局部變量” 這種說法是不錯(cuò)的,但是不準(zhǔn)確。我們來看這樣一段代碼:

#include <stdio.h>
int main()
{
	int func = 10;
	if (func)
	{
		int num = 1;
	}
	printf("%d", num);
	return 0;
}

同樣編譯器也會(huì)報(bào)錯(cuò):

所以正確的理解應(yīng)該是:在 { } 中定義的變量叫做局部變量。

那么我們順?biāo)浦厶嵋粋€(gè)問題:局部變量與我們的關(guān)鍵字 auto 有什么聯(lián)系?

其實(shí)在早期的C語(yǔ)言中,局部變量是需要用 auto 修飾的,但現(xiàn)在的編譯器發(fā)展越來越智能,會(huì)自動(dòng)識(shí)別哪個(gè)變量是局部變量。所以,現(xiàn)在對(duì)于局部變量的 auto 關(guān)鍵字都是省略的。

我們可用這段代碼證明:

#include <stdio.h>
void print()
{
	auto int a = 10;
	printf("%d\n", a);
}
int main()
{
	int a = 10;
	printf("%d\n", a);
	print();
	return 0;
}

所以對(duì)于 auto 這個(gè)關(guān)鍵字來說,只需了解、知道就好。

2.register

千萬(wàn)不能把這個(gè)單詞翻譯成:登記、注冊(cè)!正確的翻譯應(yīng)該是:寄存器。

那寄存器是什么?寄存器是計(jì)算機(jī) CPU 的一組硬件,存在的本質(zhì)是提高計(jì)算機(jī)的運(yùn)行效率,因?yàn)榧拇嫫鞑恍枰獜膬?nèi)存中拿數(shù)據(jù)。也就是說把數(shù)據(jù)直接放在寄存器,直接供 CPU 計(jì)算,從而提升運(yùn)行效率。

所以我們大膽猜測(cè):register 修飾的變量,意義在于盡量把修飾的變量放入 CPU 寄存器中。

那么什么樣的變量適合用 register 來修飾呢?

  • 局部變量(全局變量會(huì)長(zhǎng)時(shí)間占用寄存器)
  • 不會(huì)被寫入的變量(因?yàn)橐坏懭雽?huì)寫回內(nèi)存,register 就沒有意義了)
  • 被高頻使用的變量

我們通過代碼來闡述如何使用這個(gè)關(guān)鍵字:

#include <stdio.h>
int main()
{
	register num = 10;
	int sum = 0;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		sum += num+i;
	}
	printf("%d\n", sum);
	return 0;
}

這段代碼完美符合了適合使用 register 修飾的變量的三個(gè)條件,雖然規(guī)模又億些小,算法有億些簡(jiǎn)單。num 變量是局部變量,并且接下來的代碼沒有對(duì)其進(jìn)行寫入,并且重復(fù)使用了 10 次。

如果我們寫了 200000 個(gè)局部變量,并且所有的局部變量都用 register 來修飾,那么編譯器會(huì)不會(huì)因?yàn)榧拇嫫鞑粔蛴枚鴪?bào)錯(cuò)?我認(rèn)為不會(huì),因?yàn)?register 的定義是盡量把變量放入寄存器中。

3.static

對(duì)于 static 這個(gè)關(guān)鍵字,一般應(yīng)用于多文件操作中,這是因?yàn)橛欣陧?xiàng)目維護(hù)、提供安全保證。

那么對(duì)于多文件操作不是本篇的內(nèi)容,我會(huì)在另外一篇單獨(dú)寫一篇關(guān)于這塊的內(nèi)容。

那么 stactic 可以修飾的對(duì)象有三個(gè):

  • 全局變量
  • 函數(shù)
  • 局部變量

我們先觀察全局變量沒有被 static 修飾的時(shí)候的效果:

我們?cè)?test.c 文件中定義全局變量:

//test.c
int num = 10;

在 test.h 文件中對(duì)此聲明:

//test.h
#pragram once
#include <stdio.h>
extern int num;

在 main.c 文件中使用此變量:

//main.c
#include "test.h"
int main()
{
	printf("%d\n", num);
	return 0;
}

運(yùn)行結(jié)果:

現(xiàn)在我們來觀察當(dāng)全局變量被 static 修飾的時(shí)候會(huì)發(fā)生什么:

在 test.c 下使用 static 修飾全局變量,其他文件不變:

//test.c
static int num = 10;

運(yùn)行結(jié)果:

可以看到這個(gè)程序在鏈接時(shí)出現(xiàn)了錯(cuò)誤,即 num 變量“消失”了一樣。那么這種“消失”恰恰是 static 的魅力所在。

結(jié)論一:對(duì)于 static 修飾的全局變量,該變量就變?yōu)橹荒茉诒疚募惺褂茫荒鼙黄渌募苯邮褂谩?/p>

但是要注意,僅僅是不能被直接使用,我們通過間接訪問,程序還是可以運(yùn)行的:

我們?cè)?test.c 中定義一個(gè)函數(shù):

//test.c
#include "test.h"
static int num = 10;
void print()
{
	printf("%d\n", num);
}

test.h 文件中聲明 print 函數(shù):

//test.h
#pragma once
#include <stdio.h>
extern int num;
void print();

在 main.c 文件中我們這樣做:

//main.c
#include "test.h"
int main()
{
	//printf("%d\n", num);
	print();
	return 0;
}

那么運(yùn)行的效果:

上面這種情況我們可以把它視為 static 沒有修飾 print 函數(shù)的情況。所以現(xiàn)在我們來討論 static 修飾函數(shù)時(shí)候的情況:

在 test.c 文件中修飾 print 函數(shù):

//test.c
#include "test.h"
int num = 10;
static void print()
{
	printf("%d\n", num);
}

test.h 、main.c 文件不變,運(yùn)行結(jié)果為:

可以看到函數(shù)被 static 修飾的效果與 全局變量變量被 static 修飾的時(shí)候一致,那么我們不難得出下面的結(jié)論:

結(jié)論二:當(dāng) static 修飾函數(shù)時(shí),此函數(shù)只能在本文件內(nèi)使用,不能被其他文件直接訪問。

同理,我們可以修改代碼來達(dá)到間接訪問:

我們?cè)?test.c 中多寫一個(gè)函數(shù):

//test.c
#include "test.h"
int num = 10;
static void print()
{
	printf("%d\n", num);
}
void func()
{
	print();
}

在 test.h 中對(duì)此函數(shù)進(jìn)行聲明:

//test.h
#pragma once
#include <stdio.h>
extern int num;
void print();
void func();

在 main.c 中調(diào)用:

//main.c
#include "test.h"
int main()
{
	//printf("%d\n", num);
	//print();
	func();
	return 0;
}

運(yùn)行結(jié)果:

現(xiàn)在,我們觀察局部變量沒有被 static 修飾的時(shí)候的一段代碼:

#include <stdio.h>
void test()
{
	int i = 0;
	i++;
	printf("%d\n", i);
}
int main()
{
	for (int i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

那么它的輸出結(jié)果是:

很明顯,超出了我們的預(yù)期。我們的預(yù)期是輸出 1,2,3,4,5,6,7,8,9,10 。為什么輸出 10 次輸出的都是 1 呢?對(duì)于局部變量來說,生命周期在 { } 中定義開始,在出 { } 時(shí)結(jié)束。也就是說,在 { } 中定義的局部變量在內(nèi)存中開辟了一塊空間,在出 { } 時(shí)開辟的空間釋放(銷毀)。

那有什么辦法能使空間不被釋放呢?有,那就是用 static 修飾局部變量:

#include <stdio.h>
void test()
{
	static int i = 0;
	i++;
	printf("%d\n", i);
}
int main()
{
	for (int i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

輸出的結(jié)果是:

那么為什么會(huì)輸出這樣的結(jié)果呢?從上面的結(jié)果分析我們知道了局部變量的生命周期,我們只要改變局部變量的生命周期就能夠解決問題。也就是說,static 修飾的局部變量,能夠讓其原本儲(chǔ)存在棧區(qū)而讓其存儲(chǔ)到靜態(tài)區(qū),只能被定義一次(對(duì)于任何變量來說都是這樣,只不過我們的重點(diǎn)在于改變變量的生命周期)從而達(dá)到修改生命周期的作用。

結(jié)論三:static 修飾局部變量,能夠讓其生命周期從局部周期變?yōu)槿种芷凇?/p>

到此這篇關(guān)于C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 auto register static內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++遍歷文件夾下文件的方法

    C++遍歷文件夾下文件的方法

    這篇文章主要介紹了C++遍歷文件夾下文件的方法,實(shí)例分析了C++針對(duì)文件夾遍歷的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C++中約數(shù)定理的實(shí)例詳解

    C++中約數(shù)定理的實(shí)例詳解

    這篇文章主要介紹了C++中約數(shù)定理的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • VS Code 中安裝運(yùn)行、編寫C語(yǔ)言程序的詳細(xì)教程

    VS Code 中安裝運(yùn)行、編寫C語(yǔ)言程序的詳細(xì)教程

    這篇文章主要介紹了VS Code 中安裝運(yùn)行、編寫C語(yǔ)言程序的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++中小數(shù)點(diǎn)輸出格式(實(shí)例代碼)

    C++中小數(shù)點(diǎn)輸出格式(實(shí)例代碼)

    下面小編就為大家?guī)硪黄狢++中小數(shù)點(diǎn)輸出格式(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++迭代器iterator詳解

    C++迭代器iterator詳解

    這篇文章主要為大家詳細(xì)介紹了C++迭代器模式Iterator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下希望能給你帶來幫助
    2021-08-08
  • C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程

    C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程

    這篇文章主要介紹了C語(yǔ)言中邏輯運(yùn)算符與條件運(yùn)算符的學(xué)習(xí)教程,條件運(yùn)算符問號(hào)即三目運(yùn)算符使用起來十分方便,需要的朋友可以參考下
    2016-04-04
  • 一文搞懂C語(yǔ)言static關(guān)鍵字的三個(gè)作用

    一文搞懂C語(yǔ)言static關(guān)鍵字的三個(gè)作用

    這篇文章主要介紹了C語(yǔ)言static關(guān)鍵字的三個(gè)作用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例

    C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例

    C++ 11 中的 Lambda 表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++中Lambda表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • VC++進(jìn)度條process Bar的用法實(shí)例

    VC++進(jìn)度條process Bar的用法實(shí)例

    這篇文章主要介紹了VC++進(jìn)度條process Bar的用法,是進(jìn)行VC++應(yīng)用程序開發(fā)中非常常見的實(shí)用技巧,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單回聲服務(wù)器

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單回聲服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單回聲服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論