(本文采用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.點完贊你就看得懂了 •ᴗ•