C++中单引号和双引号的区别

liuhao159753 2009-09-10 07:11:40
看到某贴,单引号代表字符,双引号代表字符串,后面加个“\0”,为什么如下代码输出结果均为4?不是说代表一个字符o的么,返回的应该是o的位置2才对.......

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string name("heolloketokty");
int pos = name.find('ok'); //此处改为“ok”,双引号,结果均为6,而且返回的是k的下标,而不是o的
cout<<pos<<endl;
return 0;
}
...全文
788 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Monk_D 2011-07-28
  • 打赏
  • 举报
回复
感谢~~
huoyici 2009-09-18
  • 打赏
  • 举报
回复
看看
liuhao159753 2009-09-11
  • 打赏
  • 举报
回复
9楼和12楼,小弟感激不尽,9楼的解说非常细致,12楼给出症结所在,多谢啦~~~
setsailgo 2009-09-10
  • 打赏
  • 举报
回复
学习
ForestDB 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mstlq 的回复:]
双引号大家都说了……
我来说说单引号……

其实呢……
'ok'是一个int常量
大小等于28523(111*256+107)
111是‘0’的ascii码
107是‘k’的ascii码


name.find('ok');时,将'ok'强制转换成char型,导致第九位之后的数据阶段,效果等同于
name.find(107);,即是name.find(‘k’);
[/Quote]
顶这个
''表示int常量了,如果里面不止一个字符,就超越了ascii的范畴了。
zgjxwl 2009-09-10
  • 打赏
  • 举报
回复
对了。。楼主MSDN的时候要查find函数的时候。。先查 basic_string,find是该类的成员函数
wanggang_0717 2009-09-10
  • 打赏
  • 举报
回复
jf
mstlq 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
""是字符串,C风格字符串后面有一个'\0'
''是一个字符,一共就一字节。
[/Quote]
‘k’其实是4个字节的常量(整型)……
char k= 'k'
k是一个字节的变量……
mstlq 2009-09-10
  • 打赏
  • 举报
回复
双引号大家都说了……
我来说说单引号……

其实呢……
'ok'是一个int常量
大小等于28523(111*256+107)
111是‘0’的ascii码
107是‘k’的ascii码


name.find('ok');时,将'ok'强制转换成char型,导致第九位之后的数据阶段,效果等同于
name.find(107);,即是name.find(‘k’);
magrich 2009-09-10
  • 打赏
  • 举报
回复
VC6.0下也是5.如果用单引号能编译通过吗?
zgjxwl 2009-09-10
  • 打赏
  • 举报
回复
对于"ok",楼主会发现。。。传进去的也将是字符串"ok"
zgjxwl 2009-09-10
  • 打赏
  • 举报
回复
楼主,这个不是单引号和双引号的问题,单引号和双引号只是传递给find函数的实参

find函数有几个重载版本的,根据不同的实参类型,绑定到不同的find函数版本上

这里,'ok'的类型是char类型,姑且不看编译器是如何处理的,而"ok"是char*类型的

然后查MSDN可以看到。有这样两个find函数会在这里用到,其他的不罗列,楼主自己msdn吧


//The type is a synonym for the template parameter Type.

typedef Type value_type; //这里 Type 是个模板参数

size_type find(
value_type _Ch,
size_type _Off = 0
) const;


size_type find(
const value_type* _Ptr,
size_type _Off = 0
) const;


所以。。。上面两个函数,分别接收的是字符版本的find,即接受char类型实参
和接收字符串版本的find,即接受char*类型的实参。。

楼主可以单步跟踪下看。。。。其实分别调用的是不同的函数。我这里测试跟踪了下

对于 int pos = name.find("ok"); 调用的是
size_type find(const _E *_S, size_type _P = 0) const
{return (find(_S, _P, _Tr::length(_S))); }


对于 int pos = name.find('ok'); 调用的是

size_type find(_E _C, size_type _P = 0) const
{return (find((const _E *)&_C, _P, 1)); }


然后可以转到_E的定义处,(快捷键F12)发现。。。

typedef char _E;

E就是char,实际它是通过类basic_string的模板参数传进来的。。如


template<class _E, class _Tr = char_traits<_E>, class _A = allocator<_E> >
class basic_string
{
//这里略。。。
};


而find是该类的成员函数。。。

在我这里发现。。。

int pos = name.find('ok'); //得到是6


int pos = name.find("ok"); //得到是5


对于int pos = name.find('ok'); 这个。。楼主可以单步跟下,可以看到。。
实际传进去的是字符k,而不是'ok'。。。。具体在find里怎么做的,楼主可以自己跟踪进去看。


only_lonely 2009-09-10
  • 打赏
  • 举报
回复
find的问题~,明知道是字符串,还用单引号那么故意折腾它做什么···
wanjingwei 2009-09-10
  • 打赏
  • 举报
回复
改为双引号是对的,返回o的下标5
bfhtian 2009-09-10
  • 打赏
  • 举报
回复
改为双引号,vs2005下输出结果是5
aopha 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hoomey 的回复:]
单引号和双引号的区别楼主说的没错啊

这个应该不是单引号或双引号的事吧
这个是find函数的问题
[/Quote]

对是Find的使用问题
某某9 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lianshaohua 的回复:]
字符数组和字符串
[/Quote]
  • 打赏
  • 举报
回复
""是字符串,C风格字符串后面有一个'\0'
''是一个字符,一共就一字节。
ztenv 版主 2009-09-10
  • 打赏
  • 举报
回复
字符数组和字符串
hoomey 2009-09-10
  • 打赏
  • 举报
回复
单引号和双引号的区别楼主说的没错啊

这个应该不是单引号或双引号的事吧
这个是find函数的问题

65,185

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧