不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦>學(xué)習(xí)英語(yǔ)>專(zhuān)業(yè)英語(yǔ)>計(jì)算機(jī)英語(yǔ)>

c語(yǔ)言里while的用法

時(shí)間: 長(zhǎng)思709 分享

  在C語(yǔ)言中,經(jīng)??吹絛o...while(0)的宏,do...while(0)有很多作用,下面小編就為大家分享c語(yǔ)言里while的用法,希望對(duì)你有用。

  c語(yǔ)言里while的具體用法如下:

  1、避免goto語(yǔ)句:

  通常,如果一個(gè)函數(shù)開(kāi)始要分配一些資源,然后如果在中途遇到錯(cuò)誤則要退出函數(shù),當(dāng)然,退出前要釋放資源,我們的代碼可能如下:

  C代碼

  這里最大的問(wèn)題是代碼冗余,每增加一個(gè)操作,就要做相應(yīng)的錯(cuò)誤處理,非常不靈活,于是想到了一下的goto:

  C代碼

  代碼冗余是解決了,但是引入了C語(yǔ)言中比較微妙的goto語(yǔ)句,雖然正確的使用goto語(yǔ)句可以大大提高程序的靈活性與簡(jiǎn)潔性,但是會(huì)使我們的程序捉摸不定,為了既避免使用goto語(yǔ)句,又能消除代碼冗余,可以考慮使用下面的 do...while(0):

  C代碼

  2、避免空聲明在編譯時(shí)出現(xiàn)警告:

  在linux內(nèi)核源代碼中,經(jīng)??吹饺缦潞暌员苊庠诰幾g時(shí)出現(xiàn)警告:

  #define FOO do { } while(0)

  3、提供一個(gè)聲明局部變量的基礎(chǔ)塊:

  你可能經(jīng)常會(huì)使用如下的宏:

  #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

  然而在某些情況下將會(huì)失效,下面的代碼使用if...else...

  if (x > y)

  exch(x,y); // 分支 1

  else

  do_something(); // 分支 2

  但是將被解釋為一個(gè)分支的if語(yǔ)句:

  if (x > y) {

  int tmp;

  tmp = x;

  x = y;

  y = tmp;

  }

  ; // 空語(yǔ)句

  else // ERROR!!!

  do_something();

  錯(cuò)誤出在“;”直接位于代碼塊的后面,解決的辦法是將代碼嵌入do...while(0),于是得到下面的代碼:

  1 if (x > y)

  2 do {

  3 int tmp;

  4 tmp = x;

  5 x = y;

  6 y = tmp;

  7 } while(0);

  8 else

  9 do_something();

  ?于是上面的宏可以修改為:

  1 #define exch(x,y) do {\

  2 int tmp;\

  3 tmp = x;\

  4 x = y;\

  5 y = tmp;\

  6 } while(0)

  4、在條件語(yǔ)句中使用復(fù)雜的宏:

  假如一個(gè)宏包含類(lèi)似如下幾行代碼:

  #define FOO(x) \

  printf("arg is %s\n", x); \

  do_something_useful(x);

  現(xiàn)在想像一下下面的代碼:

  if (blah == 2)

  FOO(blah);

  這將解釋為:

  if (blah == 2)

  printf("arg is %s\n", blah);

  do_something_useful(blah);;

  我們就會(huì)發(fā)現(xiàn),if語(yǔ)句只作用于printf(), do_something_useful() 沒(méi)按照愿意一起執(zhí)行,即沒(méi)有像你預(yù)期的那樣被包含在if代碼中,于是可以使用如下的代碼塊:

  if (blah == 2)

  do {

  printf("arg is %s\n", blah);

  do_something_useful(blah);

  } while (0);

  這樣上面的宏就可以改為:

  1 #define FOO(x) do { \

  2 printf("arg is %s\n", blah);\

  3 do_something_useful(blah);\

  4 } while (0)

  PS:以上的第三種和第四種技巧,并不是唯一的方法,有同學(xué)留言說(shuō)用其他的方法也可以實(shí)現(xiàn),反而顯得這樣的宏定義過(guò)于花哨?事實(shí)并非如此,這樣的宏定義在linux內(nèi)核代碼中非常常見(jiàn),原因是代碼簡(jiǎn)潔、通用、可移植性好

515211