高级C语言教程-关键字和运算符
volatile 關(guān)鍵字
一個(gè)定義為volatile的變量會(huì)被意想不到的改變,這樣編譯器就不會(huì)假設(shè)這個(gè)變量的值了,精確的來說就是編譯器在用到這個(gè)變量的時(shí)候必須每次都小心的重新讀取這個(gè)變量的值,而不是使用保存在寄存器里面的備份;
一個(gè)參數(shù)既可以是const也可以是volatile,一個(gè)經(jīng)典的例子就是只讀狀態(tài)寄存器,它是volatile,因?yàn)樗赡軙?huì)被意想不到的改變,它是const因?yàn)槌绦騿T不應(yīng)該試圖去改變它;
一個(gè)指針可以是volatile盡管這樣并不常見,例如一個(gè)中斷服務(wù)子程序修改一個(gè)指向buffer的指針的時(shí)候;
轉(zhuǎn)換方程:
a + = 表達(dá)式; => a = a + (表達(dá)式);
逗號(hào)運(yùn)算符
不管你相信與否逗號(hào)運(yùn)算符確實(shí)是合法的C運(yùn)算符,逗號(hào)的運(yùn)算符是將兩個(gè)或者多個(gè)表達(dá)式分隔開,這些表達(dá)式是自左向右依次的求值整個(gè)逗號(hào)表達(dá)式是最后也是最右邊那個(gè)表達(dá)式的值。
例如:
if( a + 3,b / 2,c >= 0);
其實(shí)if條件是否成立僅僅取決于c>=0是否成立,也就是最右邊的值才是最終的值;
條件運(yùn)算符
條件運(yùn)算符是C語言運(yùn)算符中唯一的三目運(yùn)算符,條件運(yùn)算符的使用方法如下:
表達(dá)式1?表達(dá)式2:表達(dá)式3
條件運(yùn)算符的優(yōu)先級(jí)非常的低,(僅比賦值運(yùn)算符和逗號(hào)運(yùn)算符的優(yōu)先級(jí)高),因此作為各個(gè)操作數(shù)的表達(dá)式一般不需要加括號(hào)。
如果你愛編程,你就應(yīng)該愛C語言,如果你愛C語言,你就應(yīng)該愛指針,如果你愛指針你就應(yīng)該愛函數(shù)指針,指針是C語言中最有魅力也是最有爭議的元素,是天使與魔鬼的統(tǒng)一體,,正是由于C語言對指針的靈活支持(至少一個(gè)非常重要的原因),C語言幾乎是編寫系統(tǒng)軟件(包括操作系統(tǒng),編譯器等軟件)的首選語言。
理解C語言的關(guān)鍵就是理解真正的存儲(chǔ)器。
每一個(gè)存儲(chǔ)單元都有兩個(gè)屬性,一個(gè)是存儲(chǔ)器里面存放 的內(nèi)容,二是這個(gè)存儲(chǔ)單元的地址(事實(shí)上,地址也是數(shù)據(jù),只是地址的特殊性)。
malloc(0)在我的系統(tǒng)里是可以正常返回一個(gè)非NULL值的。
malloc(0)申請的空間到底有多大不是用strlen或者sizeof來看的,而是通過malloc_usable_size這個(gè)函數(shù)來看的。—當(dāng)然這個(gè)函數(shù)并不能完全正確的反映出申請內(nèi)存的范圍。
malloc(0)申請的空間長度不是0,在我的系統(tǒng)里它是12,也就是你使用malloc申請內(nèi)存空間的話,正常情況下系統(tǒng)會(huì)返回給你一個(gè)至少12B的空間。這個(gè)可以從malloc(0)和malloc(5)的返回值都是12,而malloc(20)的返回值是20得到。
malloc(0)申請的空間是可以被使用的。
malloc只有申請失敗的時(shí)候才會(huì)返回NULL剩下的malloc(0)等下雨12的全部申請的是12B,可能不同的系統(tǒng)申請的大小是不一樣。
指針是變量的地址,在C語言中關(guān)于指針的運(yùn)算有以下幾種,:
1.同類型的指針可以做加減運(yùn)算。
2.同類型的指針可以比較大小
3.除控類型指針(void *)之外,指針可以加上一個(gè)整數(shù)或者減去一個(gè)整數(shù)。
4.除空類型指針外(void *),指針是可以進(jìn)行自增(++)自減(–)的運(yùn)算。
char *p,*q; p = "Hello!"; q = p; q[0] = 'h';
在ANSI C標(biāo)準(zhǔn)中字符串常量是存儲(chǔ)在 string literal pool 中的,并且ANSI C禁止對string literal pool 進(jìn)行修改,因?yàn)閷τ谏厦娴睦又小盚ello!”,編譯器或者連接器會(huì)將這個(gè)常量串映射到ROM等只讀區(qū)內(nèi)存區(qū),因此如果對這個(gè)區(qū)域進(jìn)行寫操作的話很可能會(huì)引起總線的錯(cuò)誤對于ARM而言就可能是Data Abort)。
然而代碼修改成:
就是正確的了;
總結(jié)
以上是生活随笔為你收集整理的高级C语言教程-关键字和运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三届“空间信息网络”学术论坛诚邀您的参
- 下一篇: 高级C语言教程-sscanf()函数使用