2011-04-04 88 views
1

我有一個函數返回一個const char *爲一個固定值,當我使用這個函數時,我做了一個「==」運算符來查找返回的值和一個i期望。這是一個很好的做法嗎?它應該是反模式嗎? 例如:const char *與==的比較

const char * LOL =「LOL」;

const char * getI(){
return LOL;
}

主{
如果(格提()== LOL)
某物();
}

+0

重複的http://stackoverflow.com/questions/2440420/compare-equality-of-char-in-c – user470379 2011-04-04 22:59:11

+0

這可能dublicate是關於你應該如何比較字符串內容。這個問題可能不是關於這個問題的。 – nos 2011-04-04 23:04:18

+0

每當我看到'LOL'我最終都會笑。我一定是個書呆子。 – Marlon 2011-04-05 01:35:15

回答

5

這是一個很好的做法嗎?

那麼,這取決於。

當且僅當您要測試由getl()返回的指針是否指向與全局指針LOL相同的字符串文字時,才這樣做是正確的。如果那不是你想要做的,那麼,不,這不是好習慣。

2

這取決於。如果您試圖檢測到字符串的實例是相同的,那麼這是正確的。如果您試圖檢測字符串的內容是否相同,那麼它不是。

+0

內容是相同的原因,它們是相同的全局常量變量。同意? – 2011-04-04 23:14:09

+0

在這種特殊情況下,是的,它們是一樣的。需要考慮的是,你是否也希望'if(getl()==「FOO」)'比較爲true,或者如果你想'if(getl()== getx())'返回true,if getx()也返回一個指向「LOL」字符串的任意指針。 – nos 2011-04-05 14:33:30

0

那麼,你試圖返回一個全局名稱的值,以便代碼更具可讀性,對嗎? (如果我誤解了,忽略:P)。推理很棒,但這不是要走的路。

這樣做的通常的方法是#define

#define MY_MEANINGFUL_RETURN 1 

int doSomething() { 
    return MY_MEANINGFUL_RETURN; 
} 

(...) 
    if (doSomething() == MY_MEANINGFUL_RETURN) 
(...) 

如果你使用上面的爲const char *己技巧,你必須對那些字符串存儲在內存中執行期間,以再比較他們的唯一記憶位置。通過第二種方法,編譯器管理這些數字,並獲得漂亮的名稱,而不需要任何額外的時間或空間。

+0

我必須使用char *,所以我選擇在#define「string」之前做「const char *」,因爲它會在每一個引用它的地方創建一個自動變量,const char *爲我節省空間。 – 2011-04-04 23:11:58

+0

如果你必須使用char *,我回答了錯誤的問題:) – slezica 2011-04-05 01:24:19

1

正如其他人所說,這取決於你想要做什麼。

當你說「我期望的價值」時,你是什麼意思?你期望什麼

無法知道你的答案:一般來說,不好的做法。據我所知,編譯器可以巧妙地重用字符串的位置。所以這種行爲:

const char *LOL = "lol"; 
const char *test = "lol"; 
return (test == LOL); 

沒有明確定義。

0

對象的身份與平等:

如果你要使用它作爲一個通道/構建「辨認」的對象(在這種情況下,全局指針LOL這實際上是隻是在你的行中的同一對象代碼),那麼它是安全的。

但仔細看看你的例子,看起來你真正想要做的是檢查「平等」:即測試兩個對象是否相等,它們是否包含相同的值?