關於C++的一道題

閱讀下面程序,然後請寫出輸出結果:

#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;
}

輸出結果如下圖:



分析:爲什麼會這樣的結果呢?首先我們先分析一下程序,首先我們先看看第一組ab,那麼ab是什麼呢?根據我們所學,我們知道ab是數組的首地址,那麼這個表達式(a==b)結果必然是不相等的,所以表達式的結果爲0.然後我們再看一下第三組,前面多了個const限定符,const限定符只是在編譯階段編譯器檢查是否程序中有修改其變量的行爲,當然我們可以通過一些手段來騙過編譯器,來達到修改其值,不過這裏有沒有const和輸出結果無關,與第一組ab是一樣的,因爲ef都是數組首地址,所以表達式(e==f)結果也必然爲0.那麼我們關注一下第二組和第四組,這裏定義的cd以及gh都是字符串指針,按道理來說他們的地址應該不相等,爲什麼(c==d)(g==h)的表達式爲1呢?原因就是編譯器過於聰明,字符串“123”在內存中只保留了一份,所以指針指向的是同一地址,那麼自然的地址也相同,必然輸出1。


爲了驗證所分析的理論成立,我們需要實踐,反彙編看看,如下圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章