有關c語言中的反斜杠 '\'


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編譯器直接將這個反斜杠理解為了“連接符”,認為它的下面一行仍然是注釋內容。

 

真是清新脫俗的一個烏龍錯誤。

 

同時也不得不感嘆小小一個反斜杠也有這么多門道。

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM