2020-02-02
關鍵字:反斜杠趣談
稍微懂點編程的同學,甭管是哪種編程語言,都知道甚至是在代碼中用過反斜杠。
反斜杠這東西的最為人所知的作用就是作為“轉義字符”以及“連接符”來使用。
例如,常見的正則表達式用途:
grep -nr "init*\.rc"
以及在 c語言 領域常見的連接代碼用途:
#define LOG(a,b) do{\ printf("[LOG]%d--%d", a, b); \ }while(0)
但筆者偶然間發現反斜杠的一個很隱秘又有趣的地方。
先來看下面這個示例程序,我們來猜猜它的執行結果是什么:
#include <stdio.h> int cal_length(char *); int main() { int amount; char *info = "China and France should respect each other."; //TODO 要考慮到單雙引號前面的轉義字符\ amount = cal_length(info); printf("The amount of the sentance:%d\n", amount); return 0; } int cal_length(char *sen) { int len = 0; while(*(sen + len) != '\0') { len++; } return len; }
正確答案是:不確定!
如上圖,同一個編譯結果,多次執行會出現不一致的結果值。
是我寫的 cal_length() 算法有問題嗎?
顯然不是,不用去懷疑我的 cal_length() 函數。
既然計算字符串長度的算法沒問題,傳參的方式也沒問題,原始字符串也沒問題,取結果的方式也沒問題。那為什么最終的結果怎么會是這樣的呢?
剛開始我也百思不得其解,各種加打印改算法都無濟於事。
直到最后,我不得不懷疑上面的代碼中 amount = cal_length(info); 這一句根本沒有去執行。
然后我開始驗證,發現直接將這句代碼刪掉,編譯以后的結果和前面是一樣的,結果值是一個不確定的值。
然后再去給定義 amount 變量的地方指定初始值,發現這時程序運行結果值就是確定的值了,我給 amount 初始化了什么值,它的運行結果就是什么值。
到這已經確定了,我上面的代碼中 amount = cal_length(info); 語句根本就沒有執行。
而不行它的原因就是因為我在它上面加的那一句注釋。
在那行注釋最后面有一個反斜杠 '\',C編譯器直接將這個反斜杠理解為了“連接符”,認為它的下面一行仍然是注釋內容。
真是清新脫俗的一個烏龍錯誤。
同時也不得不感嘆小小一個反斜杠也有這么多門道。