1. 程式人生 > >C++亂碼從入門到放棄

C++亂碼從入門到放棄

(寫在前面的話:本文采用C++11標準,本文使用到的庫檔案:iostream,沒了)

 

前幾天在一篇文章中看見一個加了兩對大括號的main函式(大概長下面這樣)

 

//一些必要的預處理程式碼...吧啦吧啦吧啦...

int main()
{
{ //程式碼主體...吧啦吧啦吧啦...
} }

 

當時我一臉懵逼,這是神馬語法,能通過編譯?於是乎我把這段程式碼COPY進了我的Dev編譯器,Amazing!居然 編譯順利過,執行也沒出錯!我突發奇想,如果能在程式碼中放一段亂碼 還不出錯 豈不是一件很裝逼的事,於是便有了下面這段程式碼

 

#include<iostream>

using namespace std;

int main()
{
    //我是一段用臉滾的亂碼
    '*';{1=='\\'+'`'?('$'):1;/***/~~~~!!!((+-+-0001/'\''|1/0x9));};;;qdsojntbz:///0]=d\f@w|e%sv)vs%$^&d*(#
    
    //我是一段用手敲的程式碼
    cout << "新年快樂呀!" << endl;
    
    return 0;
}

 

把上面的程式碼COPY進你的編譯器裡執行,你會發現它不僅順利通過了編譯,還成功輸出了"新年快樂呀!",這說明上面那段亂碼是符合C++語法的,那到底怎樣的無意義程式碼符合語法呢,經過我十多分鐘的測試,這裡來做一個總結(如果發現錯誤或有補充請通過下方評論區或通過公告欄中的郵箱告訴我,阿里嘎多!)

 

首先是最簡單的註釋(沒學過註釋的讀者也不要急,後面我會專門寫一篇文章講解註釋的),/***/和///都是常見的註釋美化小技巧,其中/***/中的第二個*和///中的最後一個/都是註釋內容,被編譯器自動省略,所以不會引起任何錯誤,我可以像下面這樣寫註釋

 

///////////////////////////////
///  /*                     ///
///  *編輯 at 2020年1月14日   ///
///  *編輯 by Space Time     ///
///  /*                     ///
///////////////////////////////

 

接下來便是塊和語句的開始和結束符了,開篇那段故事講得便是它,{是塊的開始符,}是塊的結束符,塊中可以寫入程式碼,也可以不寫任何東西(空塊),例如int main(){return 0;}中的{}就是一個寫入了return 0;的塊,而int main(){}中的{}就是一個空塊,塊可以在程式碼中套無數層,所以下面這段程式碼是符合語法的

 

int main()
{{{{}}}}

 

但值得注意的是,{}不可以在全域性作用域中出現,如下面這段程式碼是錯誤的

 

{
    int main()
    {}
}   //報錯

 

語句的結束符;也可以單獨出現(空語句),所以下面這段程式碼也是符合語法的

 

int main()
{
          ;
        ;;;;
      ;;;;;;;
    ;;;;;;;;;;
}

 

再接下來是字面量,字面量可以作為一個語句單獨出現,另外用於提高優先順序的()也是可以套無數層的,所以下面這段程式碼還是符合語法的

 

int main()
{
    "C++是世界上最好的語言!";
    3.14159;
(((3.14159)));
1 + 1;
true + false;
"你大爺" == "你大爺";
}

 

切記不要出現++1這樣的錯誤(因為1是右值),看懂了上面這段程式碼,我們再看看下面這段奇葩的程式碼

 

int main()
{
    +-1;
}

 

這既不+又不-的玩意到底是個什麼鬼啊,but actually,它還是符合語法的,這裡的+和-可以理解為正和負,所以+-1其實就是-1,但是由於兩個+連在一起就變成了++1(會報錯),兩個-連在一起就變成了--1(也會報錯),所以在寫這種字面量時必須一+一-地交替寫,還弄不清楚可以參考下面這段程式碼

 

int main()
{
    +1;    //通過
    -1;    //通過
    +-1;    //通過
    ++1;    //報錯
    --1;    //報錯
    --+1    //報錯
    +-+-1;    //通過
    -+-+-+1;    //通過
}

 

最後一個也是最難想到的,先來看下面這段程式碼

 

int main()
{
    CppNB:
123;
}

 

注意CppNB後面的結束符是:而不是;,沒想到吧,這段程式碼又雙叒叕是符合語法的(不用懷疑,我瞎敲得程式碼永遠是符合語法的),這是因為goto語句的標記是以:結尾的,所以只要你在:前敲的亂碼符合goto標記的命名規範,它就不會報錯(其實goto標記的命名規範和變數的命名規範是一樣的),但要注意的是,標記後邊必須有程式碼,想下面這樣就是錯誤的

 

int main()
{
    CppNB:    //報錯
}

 

看到這裡你大概已經能夠看懂開頭那段我用臉滾的程式碼了,如果你還是看不懂,那可能是因為你不知道下面這些:

 

1.C++中以0開頭的字面量是八進位制數

2.C++中以0x開頭的字面量是十六進位制數

2./是÷的意思

4.|是邏輯運算子 或

5.!是邏輯運算子 非

6.~是位運算子 按位取反

-6.\\是轉義字元 \

7.\'是轉義字元 '

8.'可以隱式轉換為它對應的ASCLL碼(我記得好像是39)

9.三目運算子語法是 判斷我是true還是false?是ture取我:是false取我; (具體請自行谷歌)

0.我不太會數數

9.點完贊你就看得懂了 •ᴗ&b