閱讀下面程序,然後請寫出輸出結果:
#include <iostream>
using namespace std;
int main()
{
char a[]="123";
char b[]="123";
char *c="123";
char *d="123";
const char e[]="123";
const char f[]="123";
const char *g="123";
const char *h="123";
cout<<(a==b)<<" "<<(c==d)<<" "<<(e==f)<<" "<<(g==h)<<endl;
return 0;
}
輸出結果如下圖:
分析:爲什麼會這樣的結果呢?首先我們先分析一下程序,首先我們先看看第一組a和b,那麼a和b是什麼呢?根據我們所學,我們知道a和b是數組的首地址,那麼這個表達式(a==b)結果必然是不相等的,所以表達式的結果爲0.然後我們再看一下第三組,前面多了個const限定符,const限定符只是在編譯階段編譯器檢查是否程序中有修改其變量的行爲,當然我們可以通過一些手段來騙過編譯器,來達到修改其值,不過這裏有沒有const和輸出結果無關,與第一組a和b是一樣的,因爲e和f都是數組首地址,所以表達式(e==f)結果也必然爲0.那麼我們關注一下第二組和第四組,這裏定義的c和d以及g和h都是字符串指針,按道理來說他們的地址應該不相等,爲什麼(c==d)和(g==h)的表達式爲1呢?原因就是編譯器過於聰明,字符串“123”在內存中只保留了一份,所以指針指向的是同一地址,那麼自然的地址也相同,必然輸出1。
爲了驗證所分析的理論成立,我們需要實踐,反彙編看看,如下圖: