国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

水滴石穿C語言之static辨析

2019-11-17 05:50:58
字體:
供稿:網(wǎng)友
1、概述

  static 聲明的變量在C語言中有兩方面的特征:

  1)、變量會(huì)被放在程序的全局存儲(chǔ)區(qū)中,這樣可以在下一次調(diào)用的時(shí)候還可以保持原來的賦值。這一點(diǎn)是它與堆棧變量和堆變量的區(qū)別。

  2)、變量用static告知編譯器,自己僅僅在變量的作用范圍內(nèi)可見。這一點(diǎn)是它與全局變量的區(qū)別。

  2、問題:Static的理解

  關(guān)于static變量,請選擇下面所有說法正確的內(nèi)容:

  A、若全局變量僅在單個(gè)C文件中訪問,則可以將這個(gè)變量修改為靜態(tài)全局變量,以降低模塊間的耦合度;

  B、若全局變量僅由單個(gè)函數(shù)訪問,則可以將這個(gè)變量改為該函數(shù)的靜態(tài)局部變量,以降低模塊間的耦合度;

  C、設(shè)計(jì)和使用訪問動(dòng)態(tài)全局變量、靜態(tài)全局變量、靜態(tài)局部變量的函數(shù)時(shí),需要考慮重入問題;

  D、靜態(tài)全局變量過大,可那會(huì)導(dǎo)致堆棧溢出。

  答案與分析:

  對于A,B:根據(jù)本篇概述部分的說明b),我們知道,A,B都是正確的。

  對于C:根據(jù)本篇概述部分的說明a),我們知道,C是正確的(所謂的函數(shù)重入問題,下面會(huì)具體闡述)。

  對于D:靜態(tài)變量放在程序的全局?jǐn)?shù)據(jù)區(qū),而不是在堆棧中分配,所以不可能導(dǎo)致堆棧溢出,D是錯(cuò)誤的。

  因此,答案是A、B、C。

  3、問題:不可重入函數(shù)

  曾經(jīng)設(shè)計(jì)過如下一個(gè)函數(shù),在代碼檢視的時(shí)候被提醒有bug,因?yàn)檫@個(gè)函數(shù)是不可重入的,為什么?

unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum = 0; // 注重,是static類型的。
 for (index = 1; index <= base; index++)
 {
  sum += index;
 }
 return sum;
}

  答案與分析:

  所謂的函數(shù)是可重入的(也可以說是可猜測的),即:只要輸入數(shù)據(jù)相同就應(yīng)產(chǎn)生相同的輸出。

  這個(gè)函數(shù)之所以是不可猜測的,就是因?yàn)楹瘮?shù)中使用了static變量,因?yàn)閟tatic變量的特征,這樣的函數(shù)被稱為:帶“內(nèi)部存儲(chǔ)器”功能的的函數(shù)。因此假如我們需要一個(gè)可重入的函數(shù),那么,我們一定要避免函數(shù)中使用static變量,這種函數(shù)中的static變量,使用原則是,能不用盡量不用。

  將上面的函數(shù)修改為可重入的函數(shù)很簡單,只要將聲明sum變量中的static要害字去掉,變量sum即變?yōu)橐粋€(gè)auto 類型的變量,函數(shù)即變?yōu)橐粋€(gè)可重入的函數(shù)。

  當(dāng)然,有些時(shí)候,在函數(shù)中是必須要使用static變量的,比如當(dāng)某函數(shù)的返回值為指針類型時(shí),則必須是static的局部變量的地址作為返回值,若為auto類型,則返回為錯(cuò)指針。




發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 尤溪县| 柳林县| 丰原市| 北京市| 本溪| 隆德县| 桦南县| 灵丘县| 仙居县| 晋城| 威宁| 漳浦县| 周至县| 商水县| 兰西县| 旬邑县| 永康市| 夏河县| 铁岭县| 莱阳市| 南木林县| 丹棱县| 古田县| 兖州市| 亳州市| 淄博市| 嘉鱼县| 含山县| 阿城市| 楚雄市| 美姑县| 吴堡县| 遵义市| 吕梁市| 大理市| 若羌县| 东阳市| 北安市| 澎湖县| 沙田区| 朝阳县|