2016-04-03 97 views
0
#include <iostream> 

int main() { 
    char* a = "test"; 
    char b[] = "test"; 

    if (a == "test") // work 
     std::cout << "1"; 

    if (b == "test") // don't 
     std::cout << "2"; 
} 

在兩個變體中究竟發生了什麼?只是記憶地址比較?不同之處比較字符數組和char字符串的指針字符串字符串

+0

相關:除非你的編譯器足夠聰明來合併重複的字符串常量(通常是一個配置標誌),否則if(a ==「test」)......也不起作用。 – WhozCraig

+0

我想知道如果這是整個代碼,'b ==「test」'是否在法律上允許爲真。可能不是 –

+0

我是btw。令人驚訝的是,編譯器允許'char * a =「test」;'這是有效的c代碼,但在C++中無效,因爲字符串文字的類型爲'const char [N]',可以轉換爲'const char *但不是'char *' – MikeMB

回答

5

在這兩種情況下,你是不是比較實際的字符串(使用strcmp此),但地址:

  1. 在第一種情況下,你都將存儲在a地址 - 一個字符串的起始地址文字"test" - 與(概念上)不同的字符串文字的起始地址,恰好具有相同的內容。但是,如果代碼中有多個相同的字符串文字,編譯器可以將它們全部存儲在同一個位置以節省內存,因此比較結果爲真(儘管這不一定每次都會發生)。
  2. 然而,在第二種情況下,您將第一個元素b的地址與字符串文字的地址進行比較。在這裏,b是包含字符串"test"的副本,但駐留在一個完全不同的存儲區域的本地陣列,所以這個比較失敗(而且將永遠失敗)

注意:除非你有一個很好的理由不當然,你應該像PaulEvans所說的那樣使用std::string而不是char數組來存儲字符串。這會給你所期望的所有好的語義屬性和操作符重載。

2

在這兩種情況下,你都在比較指針不是字符串,所以它們都是運氣不好的。

比較字符串的最佳方法是使用std::string。例如:

std::string c = "test"; 

if (c == "test") 
    std::cout << "c really is \"test\"!\n";