1樓:小魚君吐槽
volatile的本意是一般有兩種說法。1.「暫態的 2.
「易變的。這兩種說法都有可行。乙個定義為volatile的變數是說這變數可能會被意想不到的改變,這樣,編譯器就不會去假設這個變數的值了。
優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。 www.okeycar.com
2樓:
簡單的理解就是這個變數可能會被外部函式改變,為了讓這個改變能有效執行,不被編譯器優化掉。
舉個例子吧,乙個函式用了乙個外部的變數,但這個變數在此函式中沒有改變,只是引用,這時候編譯器會去做優化,把它的值暫放在內部暫存器中,用的時候讀取的是暫存器的值,而不是去訪問它的位址取值,這樣的話,當這個變數在外部發生了變化的時候,比如中斷,或者另外的程序等等。但在這個函式裡面就不能起作用,因為被優化後使用的是暫存器的值,還是原來的值,導致錯誤發生。這種情況下,就要加上這個定義,就不會被優化了。
c語言中volatile關鍵字是什麼含義
3樓:匿名使用者
說明這個變數不允許編譯器進行自作聰明的優化。
4樓:匿名使用者
用volatile關鍵字定義變數,相當於告訴編譯器,這個變數的值會隨時發生變化,每次使用時都需要去記憶體裡重新讀取它的值,並不要隨意針對它作優化。
不使用volatile定義的變數,可能因為編譯器優化而出現一些問題,具體可以看給出的參考資料,裡面有乙個例子。
建議使用volatile變數的場所:
(1) 並行裝置的硬體暫存器
(2) 乙個中斷服務子程式中會訪問到的非自動變數(全域性變數)(3) 多執行緒應用中被幾個任務共享的變數
5樓:
volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,(vc++ 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。)。
例如:volatile int i=10;
int j = i;
...int k = i;
volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中。
而優化做法是,由於編譯器發現兩次從i讀資料的**之間的**沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。這樣以來,如果i是乙個暫存器變數或者表示乙個埠資料就容易出錯,所以說volatile可以保證對特殊位址的穩定訪問,不會出錯。
c語言中的32個關鍵字分別是什麼意思
6樓:匿名使用者
1. 資料型別關鍵字(12個):
(1). char :宣告字元型變數或函式
(2). double :宣告雙精度變數或函式
(3). enum :宣告列舉型別
(4). float:宣告浮點型變數或函式
(5). int: 宣告整型變數或函式
(6). long :宣告長整型變數或函式
(7). short :宣告短整型變數或函式
(8). signed:宣告有符號型別變數或函式
(9). struct:宣告結構體變數或函式
(10). union:宣告聯合資料型別
(11). unsigned:宣告無符號型別變數或函式
(12). void :宣告函式無返回值或無引數,宣告無型別指標(基本上就這三個作用)
(2)控制語句關鍵字(12個):
a.迴圈語句
(1). for: 一種迴圈語句(可意會不可言傳)
(2). do : 迴圈語句的迴圈體
(3). while :迴圈語句的迴圈條件
(4). break:跳出當前迴圈
(5). continue:結束當前迴圈,開始下一輪迴圈
b.條件語句
(1).if: 條件語句
(2).else :條件語句否定分支(與 if 連用)
(3).goto:無條件跳轉語句
c.開關語句
(1).switch :用於開關語句
(2).case:開關語句分支
(3).default:開關語句中的「其他」分支
d. return :子程式返回語句(可以帶引數,也看不帶引數)
3. 儲存型別關鍵字(4個):
(1).auto :宣告自動變數 一般不使用
(2).extern:宣告變數是在其他檔案正宣告(也可以看做是引用變數)
(3).register:宣告積存器變數
(4). static :宣告靜態變數
4. 其它關鍵字(4個):
(1).const :宣告唯讀變數
(2).sizeof:計算資料型別長度
(3).typedef:用以給資料型別取別名(當然還有其他作用)
(4).volatile:說明變數在程式執行中可被隱含地改變
1、演算法
程式處理資料的流程被稱為演算法,演算法可以用言語描述,也可以用流程圖描述.
2、程式
不管用什麼語言來表達的對問題的描述,通常都稱為程式。
3、資料結構
資料結構是計算機儲存、組織資料的方式。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率的演算法。資料結構往往同高效的檢索演算法和索引技術有關。
4、資料型別
資料型別是指資料的內在表現形式。通俗地說,我們把資料加工計算中的特徵稱為資料型別。
5、字串
字串或串(string)是由零個或多個字元組成的有限序列。一般記為 s='a1a2•••an'(n>=0)。它是程式語言中表示文字的資料型別。
通常以串的整體作為操作物件,如:在串中查詢某個子串、求取乙個子串、在串的某個位置上插入乙個子串以及刪除乙個子串等。兩個字串相等的充要條件是:
長度相等,並且各個對應位置上的字元都相等。設p、q是兩個串,求q在p中首次出現的位置的運算叫做模式匹配。串的兩種最基本的儲存方式是順序儲存方式和鏈結儲存方式。
6、表示式
用運算子和括號將運算物件(常量、變數和函式等)連線起來的、符合c語言語法規則的式子,稱為表示式。
7、主調函式
在函式中,可以使用函式呼叫語句,來呼叫其他函式(稱為被呼叫函式),這時,就把控制轉移到被呼叫函式,而在被呼叫函式執行完畢或執行到語句return時,又把控制轉向原來的函式(稱為主調函式).
8、被調函式
9、變數
在程式執行過程中,其值不發生改變的量稱為常量,取值可變的量稱為變數。
c語言程式設計與應用開發
一.c語言的運算子和運算順序
二.c語言的四種程式結構
(1)順序結構 (2) 分支結構(3)迴圈結構(4)模組化程式結構
三.掌握一些簡單的演算法
1 資料型別關鍵字
a基本資料型別(5個)
void :宣告函式無返回值或無引數,宣告無型別指標,顯式丟棄運算結果
char :字元型型別資料,屬於整型資料的一種
int :整型資料,通常為編譯器指定的機器字長
float :單精度浮點型資料,屬於浮點資料的一種
double :雙精度浮點型資料,屬於浮點資料的一種
b 型別修飾關鍵字(4個)
short :修飾int,短整型資料,可省略被修飾的int。
long :修飾int,長整形資料,可省略被修飾的int。
signed :修飾整型資料,有符號資料型別
unsigned :修飾整型資料,無符號資料型別
c 複雜型別關鍵字(5個)
struct :結構體宣告
union :共用體宣告
enum :列舉宣告
typedef :宣告型別別名
sizeof :得到特定型別或特定型別變數的大小
d 儲存級別關鍵字(6個)
auto :指定為自動變數,由編譯器自動分配及釋放。通常在棧上分配
static :指定為靜態變數,分配在靜態變數區,修飾函式時,指定函式作用域為檔案內部
register :指定為暫存器變數,建議編譯器將變數儲存到暫存器中使用,也可以修飾函式形參,建議編譯器通過暫存器而不是堆疊傳遞引數
extern :指定對應變數為外部變數,即在另外的目標檔案中定義,可以認為是約定由另外檔案宣告的物件的乙個「引用」
const :與volatile合稱「cv特性」,指定變數不可被當前執行緒/程序改變(但有可能被系統或其他執行緒/程序改變)
volatile :與const合稱「cv特性」,指定變數的值有可能會被系統或其他程序/執行緒改變,強制編譯器每次從記憶體中取得該變數的值
2 流程控制關鍵字
a 跳轉結構(4個)
return :用在函式體中,返回特定值(或者是void值,即不返回值)
continue :結束當前迴圈,開始下一輪迴圈
break :跳出當前迴圈或switch結構
goto :無條件跳轉語句
b 分支結構(5個)
if :條件語句
else :條件語句否定分支(與if連用)
switch :開關語句(多重分支語句)
case :開關語句中的分支標記
default :開關語句中的「其他」分治,可選。
c 迴圈結構(3個)
for :for迴圈結構,for(1;2;3)4;的執行順序為1->2->4->3->2...迴圈,其中2為迴圈條件
do :do迴圈結構,do 1 while(2); 的執行順序是 1->2->1...迴圈,2為迴圈條件
while :while迴圈結構,while(1) 2; 的執行順序是1->2->1...迴圈,1為迴圈條件
以上迴圈語句,當迴圈條件表示式為真則繼續迴圈,為假則跳出迴圈。
c語言 中volatile關鍵字的用法
7樓:百物電腦配件店
volatile是個多執行緒變數,就是可能在很多函式中會修改他。特別是中斷函式中一定要用他。volatile的意思就是「不穩定的」可能突發地改變它,微控制器每次呼叫他的話,都要從他的位址取數。
預防微控制器不知道普通的變數改變了,還是用上一次的資料。
定義方法是 :
volatile char i; //定義乙個字元型的多執行緒變數"i"
volatile int j; //定義乙個整型的多執行緒變數"j"
記得給我打個辛苦分!哈哈
8樓:魔群領袖
我就用上面的例子吧
volatile int i = 10;
int k = i;
這段**如果沒有加上volatile,它的執行過程是 i = 10, 10 ->reg暫存器,k = reg值,就是說,k=i實際上是從暫存器裡讀出來的。這樣快捷高效,當然並不是每次都這樣,因為暫存器有限。如果在10->reg暫存器的時候,i儲存的記憶體變化了,也就是別的執行緒修改了i的值,k=i仍然會按照i=10來執行
加上volatile後,執行過程是 i = 10, k = *(int *)(&i); 它會從i的記憶體位址上去讀,當然值會非常準確,但是效率會比從暫存器中讀要慢很多。
c語言中volatile關鍵字是什麼含義
說明這個變數不允許編譯器進行自作聰明的優化。 用volatile關鍵字定義變數,相當於告訴編譯器,這個變數的值會隨時發生變化,每次使用時都需要去記憶體裡重新讀取它的值,並不要隨意針對它作優化。不使用volatile定義的變數,可能因為編譯器優化而出現一些問題,具體可以看給出的參考資料,裡面有乙個例子...
c語言關鍵字,C語言關鍵字有哪些?
c語言的關鍵字都是小寫的。庫函式名不屬於c語言關鍵字。標準c語言貌似有32個關鍵字。一類是基本資料型別的 void char int float short long double signed unsigned 一類是變數儲存類別的 static extern auto register vola...
求急急急!C語言中關鍵字有哪些,求解釋!還有類似int一類的符號,求解釋。謝謝
你可以在turbo c 上按 f1,f1 就會出來所以的解釋,但是英文解釋 一般用於模板,int是型別說明 求解奇怪符號文字語言一類的 50 一一一一一 目測他的腿已經斷成這樣了。乙個c語言題目,求解,求解釋 你這個程式有問題呀 y變數根本沒有定義while y 表示每迴圈一次 y的值就減一,一直到...
簡述c語言中識別符號和關鍵字的概念與區別
識別符號是在程式中使用的變數名 函式名 標號等統稱為識別符號。除庫函式的函式名由系統定義外,其餘都由使用者自定義。c 規定,識別符號只能是字母 a z,a z 數字 0 9 下劃線 組成的字串,並且其第乙個字元必須是字母或下劃線。在使用識別符號時還必須注意以下幾點 1 標準c不限制識別符號的長度,但...
c語言的關鍵字都有哪些,什麼作用
c語言中的關鍵字是c語言開發者在開發時定義有特殊 意義的字元,編譯器通過這些關鍵字編譯器才能對你的 進行解釋 額,關鍵字有各種作用呀,不同型別的作用不同 用於型別定義的,如int float double等 用於控制程式執行的,如if,for while等 c語言中有哪些關鍵字,功能是什麼?c語言關...