Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

字符串的比较与==操作符

来源: Javahaoshuang3394 分享至:
#include <iostream>
#include <stdio.h>
//#include <string.h>

using namespace std;

int main()
{
	char str1[]= "abc";//堆分配,str1为地址
	char str2[]= "abc";//堆分配,str2为地址
	const char str3[] = "abc";//堆分配,内容不可改变,str3为地址
	const char str4[] = "abc";//堆分配,内容不可改变,str4为地址
	const char* str5 = "abc";//常量内存区,str5指向常量
	const char* str6 = "abc";//常量内存区,str6指向常量
	const char* str7 = "laymu";//常量内存区,str7指向常量
	const char* str8 = "laymu";//常量内存区,str8指向常量

	str3[2]='d';

	cout << ( str1==str2 )<< endl; // ==可以理解为函数,str1和str2均为地址,肯定不相同
	cout << ( str3==str4 ) << endl; // ==可以理解为函数,str1和str2均为地址,肯定不相同
	// 因为abc可能只被维持一份,故str5和str6在这种情况下相同(地址相同),均指向相同的一块常量地址
	cout << ( str5==str6 ) << endl;
	// 因为abc可能只被维持一份,故str5和str6在这种情况下相同(地址相同),均指向相同的一块常量地址
	cout << ( str7==str8 ) << endl;

	cout << boolalpha << ( str1==str2 )<< endl; // 输出什么?
	cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
	cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
	cout << boolalpha << ( str7==str8 ) << endl; // 输出什么?

	system("pause");
	return 0;
}

先上代码,图中有三组比较,让你写出

char str1[]= "abc";//堆分配,str1为地址
char str2[]= "abc";//堆分配,str2为地址
const char str3[] = "abc";//堆分配,内容不可改变,str3为地址
const char str4[] = "abc";//堆分配,内容不可改变,str4为地址
const char* str5 = "abc";//常量内存区,str5指向常量
const char* str6 = "abc";//常量内存区,str6指向常量
const char* str7 = "laymu";//常量内存区,str7指向常量
const char* str8 = "laymu";//常量内存区,str8指向常量
    
    cout << boolalpha << ( str1==str2 )<< endl; // 输出什么?
    cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
    cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
    cout << boolalpha << ( str7==str8 ) << endl; // 输出什么?

首先要看看==,在c++中==等操作符已经被当做一般函数去实现,因此可以把==当函数来对待。

众所周知,数组名在函数参数列表中被当做地址来对待。

只要分析了这些字符串的内存实质,即可做出判断。

分析见代码注释。

需要说明一点的是:编译器对常量内存区相同字符串的处理,一般主流编译器对同一份常量只维持一份,因此会看到str5和str6相同。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史