久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2421|回復: 0
打印 上一主題 下一主題
收起左側

C語言筆記一

[復制鏈接]
跳轉到指定樓層
樓主
ID:51269 發表于 2014-11-10 22:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
(大多記于《linux_c編程一站式學習》宋勁杉)
  
一、全局變量
  1、全局變量(global variable)定義在所有函數之外,它們在程序開始運行時分配存儲空間。
  2、全局變量初始化必須是常量表達式,但局部變量還可以是表達式,如: double pi=3.14+0.0016; int minute=360;是合法的,但double pi=acos(1,0); int minute=360;int hour=minute/360;是不合法的 這是因為程序開始運行時要用適合的值來初始化全局變量,所以初始值必須保存在編譯生成的可執行文件中。而double pi=acos(1,0);需要調用函數的值只有在程序運行之后才可以得到,int hour=minute/360;不是常量表達式,所以都不合法。
  3、全局變量不初始化則是0,局部變量不初始化則是不確定的。

二、{}語句塊
 
1int i;{int i;i=0;}

  {}里面的是一個語句塊,語句塊里面的變量和局部變量一樣,每次進入語句塊時,分配存儲空間,退出語句塊時,釋放空間。語句塊也構成一個作用域的作用,所以語句塊里面i和外面的i是不同的兩個變量。
int i; for(int i;;){;} 這樣就會報重復定義的錯誤。 int i; for(;;){int i;} 不會報錯。因為for后面的{}就是一個語句塊。
  

  2
、《linux_c編程一站式學習》一書第六章循環語句中有一段話這樣說:

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

  C99
的規定我不知道,我沒有去查,但是“for(int i;;),這樣做法,i就只是for循環中的局部變量而不是整個函數的局部變量,相當于{}語句塊里面的局部變量”,這句話有待商榷,我在VC6.0上面寫一段這樣的語句
      for(int i;;)      {           int i=0;      }
  這個語句是沒有報錯的,但是

  int i;

  for(int i;;)

  {}

  卻會報重復定義。至少在
VC6.0上面(當然,這是C++的標準,所以說只是商榷,還不敢說這是作者的錯誤),這個說法是不對的。顯然,VC6.0這里for(int i;;),這里i的定義已經被當做是函數的局部變量,而不是for后面{}語句塊的局部變量!!!謹記謹記!

三、
if(a) if(b)c; else d; 注意,else d;是和if(b)c;配對的!!!

四、浮點數不能做精確比較的。五、switch
  
  1switch case 后面跟的必須是常量表達式,這個值和全局變量的初始值一樣,必須在編譯時計算出來;

  2、而且由于浮點型不適合做精確比較,所以C語言規定case后面跟的必須是整型常量表達式;

  3case后面如果沒有break就是繼續執行后面的case
switch并不是必不可缺的,因為if else也可以代替。但是,用switch會使得代碼清晰,而且,有時候編譯器會對switch進行整體的優化,使得生產的指令效率高。
六、邏輯運算
  && || !分別是logical and,logical or,logical not .關于邏輯運算的數學體系稱為布爾代數(boolean algebra)。在編程中表示真和假的數據類型叫做布爾類型,在C語言中通常用int型來表示,非0表示真,0表示假。

七、++--

 1++,可以做前綴運算符,也可以做后綴運算符。 如果把++i看做一個函數調用,它表示返回一個值,這個值等于參數值+1,此外,還把變量i的值加一; 如果把i++看做一個函數調用,它表示返回一個值,這個值等于參數值i,此外還把變量i的值加一。
  2a+++++b 這個是看成a++ ++ +b,還是a++ + ++b,還是a+ ++ ++b 這里應該按第一種方式理解。

  編譯的過程分為詞法解析和語法解析兩個階段,在詞法解析階段,編譯器總是從前到后找最長的合法
token。把這個表達式從前到后解析,變量a是一個token,a后面有兩個以上的+號,在C語言中,一個+是合法的token(可以是加分運算符或正號),兩個+號也是合法的token(可以是自增運算符),根據最長匹配原則,編譯器絕不會止步于一個+號,而是一定會把++當成一個token。再往后解析也是一個++。再往后只有一個+號了。再往后是一個變量名b

  詞法解析之后進入下一個階段語法解析。
a是一個表達式,表達式++還是表達式,表達式再++還是表達式,表達式再+b還是表達式,語法上沒問題。

  最后編譯器會做一些基本的語義分析,這時就有問題了。
++運算符要求操作數能做左值。a能做左值,所以a++沒問題,但是表達式a++的值只能做右值,不能再++了,所以編譯器就是報錯,error'++' needs lvalue

八、
goto語句和標號

  如果在一個嵌套循環中遇到某個錯誤條件需要立即跳出最外層循環做錯誤處理,可以用goto語句 如:

   for(……)

      for(……)

      { if(出現錯誤條件) goto error; }

  error:出錯處理;
  這里的
error叫標號(label),任何語句前面都可以加若干個標號,每個標號的命名也要遵循標識符的命名規則。

  但是
goto只能跳轉到同一個函數中的某個標號處,而不能調到別的函數中。
  然而,
goto太強大了,故而危害也大,goto不是必不可少的。goto一般只用于函數任何地方出錯,跳轉到函數末尾做出錯處理(如釋放先前分配的資源、恢復先前改動的全局變量等),處理完之后函數返回。除此之外,還是不要輕易用到goto語句。

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产日韩在线观看 | 日韩免费福利视频 | 日本不卡一区 | 成人免费视频 | 女同久久另类99精品国产 | 美女张开腿露出尿口 | 欧洲精品一区 | 一级国产精品一级国产精品片 | 亚洲精品一区中文字幕 | 成年人网站在线观看视频 | 一区二区三区视频免费观看 | 成人av一区| 日日av| 欧美二区三区 | 国产日韩欧美电影 | 一区二区成人 | 免费国产黄网站在线观看视频 | 亚洲精品一二区 | 色综合视频| 波多野结衣在线观看一区二区三区 | www.日韩| 精品久久久久久亚洲综合网站 | 国产美女精品视频 | 成人综合久久 | 爱草在线 | 国产精品视频999 | 丁香六月激情 | 欧洲一区在线观看 | 中文字幕在线一区二区三区 | 国际精品久久 | 亚洲精品一区二区 | 伊人焦久影院 | 国产成人精品久久二区二区 | 国产精品久久久久久久一区探花 | 欧美涩涩网| 一级黄a | 特黄视频 | 色综合久久伊人 | 久久在线| 国产精品国产精品国产专区不卡 | 青青草视频网 |