日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一行注釋也能影響運行結(jié)果?

沒想到吧,一行注釋也能影響運行結(jié)果!

創(chuàng)新互聯(lián)建站從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站建設、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元莒南做網(wǎng)站,已為上家服務,為莒南各地企業(yè)和個人服務,聯(lián)系電話:18982081108

也許你在某個段子里聽說過,某行注釋刪掉后,程序竟然不能預期執(zhí)行?真的會這樣么?你還別不信。

見證“奇跡”

 
 
 
 
  1. #include  
  2. #include  
  3. int main(void) 
  4.     int a = (int)sqrt(30); 
  5.     //is sqrt(30) + 1 > 5 ??/ 
  6.     //故意讓a++,你別管為什么 
  7.    a++; 
  8.    if(a > 5) 
  9.        printf("sqrt(30) +1 > 5 \n"); 
  10.    else 
  11.    { 
  12.        printf("sqrt(30) +1 <= 5 \n"); 
  13.    } 
  14.    return 0; 

編譯運行:

 
 
 
 
  1. $ gcc -o main main.c -trigraphs 
  2. $ ./main 
  3. sqrt(30) +1 > 5  

作為受過九年義務教育的我們,一看就知道結(jié)果是對的,畢竟 5 * 5 < 30 < 6 * 6。

但是刪掉第九行,再運行:

 
 
 
 
  1. $ ./main 
  2. sqrt(30) +1 <= 5  

結(jié)果竟然變了!!

看到這里,細心的讀者可能已經(jīng)發(fā)現(xiàn)了其中的端倪,我也就不賣關(guān)子了。接下來就說說我們本次要提到的主角-三字符組(trigraph sequences)。

三字符組

我們都知道C語言里面有很多轉(zhuǎn)義符號,例如:

 
 
 
 
  1. \n 換行符(LF) 
  2. \r 回車符(CR) 
  3. \t 水平制表符(HT) 
  4. \b 退格符(BS) 
  5. \’ 單引號 
  6. \” 雙引號 
  7. \\ 反斜杠 
  8. ...... 

當然還有很多,我就不一一列舉了。這些符號在代碼中都有特別的作用,或者無法直接輸入,因此用轉(zhuǎn)移符+其他字符組合來代替。

同樣的,早期的一些鍵盤可能沒法輸入一些特殊的符號,如:

 
 
 
 
  1. # $ @ [ \ ] ^ ` { | } ~  

于是,為了解決這個問題C語言標準規(guī)定預處理器(C preprocessor)在掃描處理C語言源文件時,替換下述的3字符出現(xiàn)為1個字符:

也就是說,??/會被替換為\,如果刪掉原先的第九行,就變成了:

 
 
 
 
  1. //is sqrt(30) + 1 > 5 \ 
  2. a++; 

我們都知道,\的存在(通常一行代碼太長,可以通過該符號來換行),使得上面看似兩行,實則是一行。即變成了:

 
 
 
 
  1. //is sqrt(30) + 1 > 5 a++; 

也就是說,a++根本不會執(zhí)行了,當然會導致最終結(jié)果不符合預期。

當然了,很多現(xiàn)代編譯器可能并不會做這樣的替換,所以這樣的問題也基本無需擔心,老實用原本的符號即可。

實際上,細心的讀者可能觀察到了,我在前面例子代碼中加了編譯選項-trigraphs,否則的話,編譯是有警告的:

 
 
 
 
  1. $ gcc -o main main.c 
  2. main.c: In function ‘main’: 
  3. main.c:6:27: warning: trigraph ??/ ignored, use -trigraphs to enable [-Wtrigraphs] 
  4.      //is sqrt(30) + 1 > 5 ??/ 

雙字符組

除了三字符組,還有雙字符組。

總結(jié)

今天的你不知道很難踩坑,知道了也沒啥用的內(nèi)容就介紹到這里了。


文章名稱:一行注釋也能影響運行結(jié)果?
當前網(wǎng)址:http://m.5511xx.com/article/dhegocc.html