標(biāo)題:
C語言筆記一
[打印本頁(yè)]
作者:
xiaoliu
時(shí)間:
2014-11-10 22:34
標(biāo)題:
C語言筆記一
(大多記于《
linux_c
編程一站式學(xué)習(xí)》宋勁杉)
一、全局變量
1
、全局變量(
global variable
)定義在所有函數(shù)之外,它們?cè)诔绦蜷_始運(yùn)行時(shí)分配存儲(chǔ)空間。
2
、全局變量初始化必須是常量表達(dá)式,但局部變量還可以是表達(dá)式,如:
double pi=3.14+0.0016;
和
int minute=360;
是合法的,但
double pi=acos(1,0);
和
int minute=360;int hour=minute/360;
是不合法的
這是因?yàn)槌绦蜷_始運(yùn)行時(shí)要用適合的值來初始化全局變量,所以初始值必須保存在編譯生成的可執(zhí)行文件中。而
double pi=acos(1,0);
需要調(diào)用函數(shù)的值只有在程序運(yùn)行之后才可以得到,
int hour=minute/360;
不是常量表達(dá)式,所以都不合法。
3
、全局變量不初始化則是
0
,局部變量不初始化則是不確定的。
二、
{}
語句塊
1
、
int i;{int i;i=0;}
{}
里面的是一個(gè)語句塊,語句塊里面的變量和局部變量一樣,每次進(jìn)入語句塊時(shí),分配存儲(chǔ)空間,退出語句塊時(shí),釋放空間。語句塊也構(gòu)成一個(gè)作用域的作用,所以語句塊里面
i
和外面的
i
是不同的兩個(gè)變量。
int i; for(int i;;){;}
這樣就會(huì)報(bào)重復(fù)定義的錯(cuò)誤。
int i; for(;;){int i;}
不會(huì)報(bào)錯(cuò)。因?yàn)?/font>for
后面的
{}
就是一個(gè)語句塊。
2
、《
linux_c
編程一站式學(xué)習(xí)》一書第六章循環(huán)語句中有一段話這樣說:
“
C99
規(guī)定一種新的
for
循環(huán)語法,變量定義可以放在
for
的第一個(gè)控制表達(dá)式里面,如:
for(int i;;)
,這樣做法,
i
就只是
for
循環(huán)中的局部變量而不是整個(gè)函數(shù)的局部變量,相當(dāng)于
{}
語句塊里面的局部變量。在
GCC
中編譯,要加上選項(xiàng)
std=c99
。但這種語法是從
C++
中借鑒的,考慮到兼容性不建議使用!
C99
的規(guī)定我不知道,我沒有去查,但是“
for(int i;;)
,這樣做法,
i
就只是
for
循環(huán)中的局部變量而不是整個(gè)函數(shù)的局部變量,相當(dāng)于
{}
語句塊里面的局部變量”,這句話有待商榷,我在
VC6.0
上面寫一段這樣的語句
for(int i;;)
{
int i=0;
}
這個(gè)語句是沒有報(bào)錯(cuò)的,但是
int i;
for(int i;;)
{}
卻會(huì)報(bào)重復(fù)定義。至少在
VC6.0
上面(當(dāng)然,這是
C++
的標(biāo)準(zhǔn),所以說只是商榷,還不敢說這是作者的錯(cuò)誤),這個(gè)說法是不對(duì)的。顯然,
VC6.0
這里
for(int i;;)
,這里
i
的定義已經(jīng)被當(dāng)做是函數(shù)的局部變量,而不是
for
后面
{}
語句塊的局部變量。。≈(jǐn)記謹(jǐn)記!
三、
if(a) if(b)c; else d;
注意,
else d;
是和
if(b)c;
配對(duì)的。!
四、浮點(diǎn)數(shù)不能做精確比較的。
五、
switch
1
、
switch
的
case
后面跟的必須是常量表達(dá)式,這個(gè)值和全局變量的初始值一樣,必須在編譯時(shí)計(jì)算出來;
2
、而且由于浮點(diǎn)型不適合做精確比較,所以
C
語言規(guī)定
case
后面跟的必須是整型常量表達(dá)式;
3
、
case
后面如果沒有
break
就是繼續(xù)執(zhí)行后面的
case
。
switch
并不是必不可缺的,因?yàn)?/font>if else
也可以代替。但是,用
switch
會(huì)使得代碼清晰,而且,有時(shí)候編譯器會(huì)對(duì)
switch
進(jìn)行整體的優(yōu)化,使得生產(chǎn)的指令效率高。
六、邏輯運(yùn)算
&&
、
||
、
!
分別是
logical and,logical or,logical not .
關(guān)于邏輯運(yùn)算的數(shù)學(xué)體系稱為布爾代數(shù)(
boolean algebra
)。在編程中表示真和假的數(shù)據(jù)類型叫做布爾類型,在
C
語言中通常用
int
型來表示,非
0
表示真,
0
表示假。
七、
++
、
--
1
、
++,
可以做前綴運(yùn)算符,也可以做后綴運(yùn)算符。
如果把
++i
看做一個(gè)函數(shù)調(diào)用,它表示返回一個(gè)值,這個(gè)值等于參數(shù)值
+1
,此外,還把變量
i
的值加一;
如果把
i++
看做一個(gè)函數(shù)調(diào)用,它表示返回一個(gè)值,這個(gè)值等于參數(shù)值
i
,此外還把變量
i
的值加一。
2
、
a+++++b
這個(gè)是看成
a++ ++ +b
,還是
a++ + ++b
,還是
a+ ++ ++b
?
這里應(yīng)該按第一種方式理解。
編譯的過程分為詞法解析和語法解析兩個(gè)階段,在詞法解析階段,編譯器總是從前到后找最長(zhǎng)的合法
token
。把這個(gè)表達(dá)式從前到后解析,變量
a
是一個(gè)
token
,a后面有兩個(gè)以上的
+
號(hào),在
C
語言中,一個(gè)
+
是合法的
token
(可以是加分運(yùn)算符或正號(hào)),兩個(gè)
+
號(hào)也是合法的
token
(可以是自增運(yùn)算符),根據(jù)最長(zhǎng)匹配原則,編譯器絕不會(huì)止步于一個(gè)
+
號(hào),而是一定會(huì)把
++
當(dāng)成一個(gè)
token
。再往后解析也是一個(gè)
++
。再往后只有一個(gè)
+
號(hào)了。再往后是一個(gè)變量名
b
。
詞法解析之后進(jìn)入下一個(gè)階段語法解析。
a
是一個(gè)表達(dá)式,表達(dá)式
++
還是表達(dá)式,表達(dá)式再
++
還是表達(dá)式,表達(dá)式再
+b
還是表達(dá)式,語法上沒問題。
最后編譯器會(huì)做一些基本的語義分析,這時(shí)就有問題了。
++
運(yùn)算符要求操作數(shù)能做左值。
a
能做左值,所以
a++
沒問題,但是表達(dá)式
a++
的值只能做右值,不能再
++
了,所以編譯器就是報(bào)錯(cuò),
error
:
'++' needs lvalue
。
八、
goto
語句和標(biāo)號(hào)
如果在一個(gè)嵌套循環(huán)中遇到某個(gè)錯(cuò)誤條件需要立即跳出最外層循環(huán)做錯(cuò)誤處理,可以用
goto
語句
如:
for(
……
)
for(
……
)
{ if(
出現(xiàn)錯(cuò)誤條件
) goto error; }
error:
出錯(cuò)處理;
這里的
error
叫標(biāo)號(hào)(
label
),任何語句前面都可以加若干個(gè)標(biāo)號(hào),每個(gè)標(biāo)號(hào)的命名也要遵循標(biāo)識(shí)符的命名規(guī)則。
但是
goto
只能跳轉(zhuǎn)到同一個(gè)函數(shù)中的某個(gè)標(biāo)號(hào)處,而不能調(diào)到別的函數(shù)中。
然而,
goto
太強(qiáng)大了,故而危害也大,
goto
不是必不可少的。
goto
一般只用于函數(shù)任何地方出錯(cuò),跳轉(zhuǎn)到函數(shù)末尾做出錯(cuò)處理(如釋放先前分配的資源、恢復(fù)先前改動(dòng)的全局變量等),處理完之后函數(shù)返回。除此之外,還是不要輕易用到
goto
語句。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1