找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2450|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語(yǔ)言筆記一

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:51269 發(fā)表于 2014-11-10 22:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
(大多記于《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í)要用適合的值來(lái)初始化全局變量,所以初始值必須保存在編譯生成的可執(zhí)行文件中。而double pi=acos(1,0);需要調(diào)用函數(shù)的值只有在程序運(yùn)行之后才可以得到,int hour=minute/360;不是常量表達(dá)式,所以都不合法。
  3、全局變量不初始化則是0,局部變量不初始化則是不確定的。

二、{}語(yǔ)句塊
 
1int i;{int i;i=0;}

  {}里面的是一個(gè)語(yǔ)句塊,語(yǔ)句塊里面的變量和局部變量一樣,每次進(jìn)入語(yǔ)句塊時(shí),分配存儲(chǔ)空間,退出語(yǔ)句塊時(shí),釋放空間。語(yǔ)句塊也構(gòu)成一個(gè)作用域的作用,所以語(yǔ)句塊里面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è)語(yǔ)句塊。
  

  2
、《linux_c編程一站式學(xué)習(xí)》一書第六章循環(huán)語(yǔ)句中有一段話這樣說(shuō):

  “
C99規(guī)定一種新的for循環(huán)語(yǔ)法,變量定義可以放在for的第一個(gè)控制表達(dá)式里面,如:for(int i;;),這樣做法,i就只是for循環(huán)中的局部變量而不是整個(gè)函數(shù)的局部變量,相當(dāng)于{}語(yǔ)句塊里面的局部變量。在GCC中編譯,要加上選項(xiàng)std=c99。但這種語(yǔ)法是從C++中借鑒的,考慮到兼容性不建議使用!

  C99
的規(guī)定我不知道,我沒有去查,但是“for(int i;;),這樣做法,i就只是for循環(huán)中的局部變量而不是整個(gè)函數(shù)的局部變量,相當(dāng)于{}語(yǔ)句塊里面的局部變量”,這句話有待商榷,我在VC6.0上面寫一段這樣的語(yǔ)句
      for(int i;;)      {           int i=0;      }
  這個(gè)語(yǔ)句是沒有報(bào)錯(cuò)的,但是

  int i;

  for(int i;;)

  {}

  卻會(huì)報(bào)重復(fù)定義。至少在
VC6.0上面(當(dāng)然,這是C++的標(biāo)準(zhǔn),所以說(shuō)只是商榷,還不敢說(shuō)這是作者的錯(cuò)誤),這個(gè)說(shuō)法是不對(duì)的。顯然,VC6.0這里for(int i;;),這里i的定義已經(jīng)被當(dāng)做是函數(shù)的局部變量,而不是for后面{}語(yǔ)句塊的局部變量。!謹(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ì)算出來(lái);

  2、而且由于浮點(diǎn)型不適合做精確比較,所以C語(yǔ)言規(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語(yǔ)言中通常用int型來(lái)表示,非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)該按第一種方式理解。

  編譯的過程分為詞法解析和語(yǔ)法解析兩個(gè)階段,在詞法解析階段,編譯器總是從前到后找最長(zhǎng)的合法
token。把這個(gè)表達(dá)式從前到后解析,變量a是一個(gè)token,a后面有兩個(gè)以上的+號(hào),在C語(yǔ)言中,一個(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è)階段語(yǔ)法解析。
a是一個(gè)表達(dá)式,表達(dá)式++還是表達(dá)式,表達(dá)式再++還是表達(dá)式,表達(dá)式再+b還是表達(dá)式,語(yǔ)法上沒問題。

  最后編譯器會(huì)做一些基本的語(yǔ)義分析,這時(shí)就有問題了。
++運(yùn)算符要求操作數(shù)能做左值。a能做左值,所以a++沒問題,但是表達(dá)式a++的值只能做右值,不能再++了,所以編譯器就是報(bào)錯(cuò),error'++' needs lvalue。

八、
goto語(yǔ)句和標(biāo)號(hào)

  如果在一個(gè)嵌套循環(huán)中遇到某個(gè)錯(cuò)誤條件需要立即跳出最外層循環(huán)做錯(cuò)誤處理,可以用goto語(yǔ)句 如:

   for(……)

      for(……)

      { if(出現(xiàn)錯(cuò)誤條件) goto error; }

  error:出錯(cuò)處理;
  這里的
error叫標(biāo)號(hào)(label),任何語(yǔ)句前面都可以加若干個(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語(yǔ)句。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表