关于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。


为了验证所分析的理论成立,我们需要实践,反汇编看看,如下图:


猜你喜欢

转载自blog.csdn.net/cyousui/article/details/14225255