请教 '\0' 和'/0'的区别

pwei007 2011-09-04 04:23:53
如题,请各位大侠赐教`~
...全文
3132 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
酱油专业户 2011-09-05
  • 打赏
  • 举报
回复
好晕啊..............
辰岡墨竹 2011-09-05
  • 打赏
  • 举报
回复
嗯,的确,26的话我收回……一时疏忽,想错了。
char降级截断这个也是implementation-defined,这些不确定的东西最好不用。
ri_aje 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 bokutake 的回复:]

引用 22 楼 frankhb1989 的回复:
21L是ISO C++03的说法。关于C++0x,至少“An ordinary character literal that contains more than
one c-char is a multicharacter literal. A multicharacter literal has type int and implemen……
[/Quote]
implementation-defined 不是 undefined。
这里是 C++ 版,肯 C 标准有啥用。
char p = 'abc'; 也不是语法错误,绝大多数实现只是数据截断。
辰岡墨竹 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 frankhb1989 的回复:]
21L是ISO C++03的说法。关于C++0x,至少“An ordinary character literal that contains more than
one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.”在N3242的说辞不变。
因为并非undefined behavior,也不违反三大正确性规则(语法规则、可诊断语义规则、ODR),所以至少从语言角度上来讲不能断言这种用法是错误的。
[/Quote]

C99 6.4.4.4p10: "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."

依赖实现的定义的就是标准未定义的行为,因为具体处理方式C标准没有规定。
此外像:
char p = 'abc';
这样明显是语法错误。

AnYidan 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 luciferisnotsatan 的回复:]
lz是在哪个网看到 /0 结束符的?
[/Quote]

这个问题很重要
FrankHB1989 2011-09-04
  • 打赏
  • 举报
回复
关于这种用法的用途,我所知的是用来作为标记(tag),生成一个不确定值但具有可读性的整数,例如:
int money_tag[] = {'RMB', 'USD', 'HKD', 'JPY'};
不过这里往往实现为直接编码,所以长度是非常受限的,像
int lang_tags[] = {'en-US', 'en-UK', 'zh-CN', 'zh-TW'};在GCC上就会超长。
这种用法在以前的C代码见得比较多。
当然,有更可靠的替代方法,举个实际例子(freetype2):
#define FT_ENC_TAG( value, a, b, c, d ) \
value = ( ( (FT_UInt32)(a) << 24 ) | \
( (FT_UInt32)(b) << 16 ) | \
( (FT_UInt32)(c) << 8 ) | \
(FT_UInt32)(d) )
typedef enum FT_Encoding_
{
FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),

FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),

FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),

/* for backwards compatibility */
FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,

FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),

FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),

FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )

} FT_Encoding;
所以没必要使用这种不靠谱的特性。
mnb1237273 2011-09-04
  • 打赏
  • 举报
回复
学习 学习~~~
FrankHB1989 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bokutake 的回复:]

引用 13 楼 pwei007 的回复:

‘/0’ 前面的/是转义字符吗?我打印出这个字符,就是显示了 0

/不是转义符,这种写法代表一个'/'(0x2f)和一个数字'0'(0x30),这种写法是错误的,不过有的编译器可能为了兼顾wchar_t,允许你这么写。因为Intel的变量是低字节在前,所以内存中是0x30 0x2f这样的顺序,你打印%c的话,就只处理的一个字符。这种非法形式……
[/Quote]
21L是ISO C++03的说法。关于C++0x,至少“An ordinary character literal that contains more than
one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.”在N3242的说辞不变。
因为并非undefined behavior,也不违反三大正确性规则(语法规则、可诊断语义规则、ODR),所以至少从语言角度上来讲不能断言这种用法是错误的
FrankHB1989 2011-09-04
  • 打赏
  • 举报
回复
2.13.2 Character literals [lex.ccon]
character-literal:
’c-char-sequence’
L’c-char-sequence’
c-char-sequence:
c-char
c-char-sequence c-char
c-char:
any member of the source character set except
the single-quote ’, backslash \, or new-line character
escape-sequence
universal-character-name
escape-sequence:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
simple-escape-sequence: one of
\’ \" \? \\
\a \b \f \n \r \t \v
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit
1 A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by the letter L, as in L’x’. A character literal that does not begin with L is an ordinary character literal, also referred to as a narrow-character literal. An ordinary character literal that contains a single c-char has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set. An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.
...
luciferisnotsatan 2011-09-04
  • 打赏
  • 举报
回复
lz是在哪个网看到 /0 结束符的?
iamnobody 2011-09-04
  • 打赏
  • 举报
回复
如果你想输出/0,应该写cout<<"/0"<<endl;双引号....
和cout<<"\0"<<endl;比较你就知道不同了
iamnobody 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bokutake 的回复:]
引用 13 楼 pwei007 的回复:

‘/0’ 前面的/是转义字符吗?我打印出这个字符,就是显示了 0

/不是转义符,这种写法代表一个'/'(0x2f)和一个数字'0'(0x30),这种写法是错误的,不过有的编译器可能为了兼顾wchar_t,允许你这么写。因为Intel的变量是低字节在前,所以内存中是0x30 0x2f这样的顺序,你打印%c的话,就只处理的一个字符。这种非法形式要避……
[/Quote]

又被抢先一步了,正解。
辰岡墨竹 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pwei007 的回复:]

‘/0’ 前面的/是转义字符吗?我打印出这个字符,就是显示了 0
[/Quote]
/不是转义符,这种写法代表一个'/'(0x2f)和一个数字'0'(0x30),这种写法是错误的,不过有的编译器可能为了兼顾wchar_t,允许你这么写。因为Intel的变量是低字节在前,所以内存中是0x30 0x2f这样的顺序,你打印%c的话,就只处理的一个字符。这种非法形式要避免用,有可能导致内存破坏。
真正的结束符'\0'是不可打印字符,不可能显示0的。
仙度瑞城 2011-09-04
  • 打赏
  • 举报
回复
为什么我在网上看到的都是\0呢?
至善者善之敌 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pwei007 的回复:]
引用 9 楼 jackyjkchen 的回复:
引用 8 楼 pwei007 的回复:

引用 6 楼 jackyjkchen 的回复:
晕,搞忘了,/0就相当于/和0……

\0才是0x00
网上的所有程序都是这么判断:如;while( (*strDest++ = * strSrc++) != ‘/0’ ); 这是strcpy函数的一段。。。 求解释

不要武断的说所有,我立刻……
[/Quote]

呵呵,明显不是你搞错了,就是网上搞错了
Roy_Smiling 2011-09-04
  • 打赏
  • 举报
回复
我是来打酱油的
pwei007 2011-09-04
  • 打赏
  • 举报
回复
‘/0’ 前面的/是转义字符吗?我打印出这个字符,就是显示了 0
hongwenjun 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]

引用 8 楼 pwei007 的回复:

引用 6 楼 jackyjkchen 的回复:
晕,搞忘了,/0就相当于/和0……

\0才是0x00
网上的所有程序都是这么判断:如;while( (*strDest++ = * strSrc++) != ‘/0’ ); 这是strcpy函数的一段。。。 求解释

不要武断的说所有,我立刻就能给你找一个用\0的,如果是判断字符串结束,……
[/Quote]

大部分是 没有 while( (*strDest++ = * strSrc++)); 没有 /0 和\0
pwei007 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]
引用 8 楼 pwei007 的回复:

引用 6 楼 jackyjkchen 的回复:
晕,搞忘了,/0就相当于/和0……

\0才是0x00
网上的所有程序都是这么判断:如;while( (*strDest++ = * strSrc++) != ‘/0’ ); 这是strcpy函数的一段。。。 求解释

不要武断的说所有,我立刻就能给你找一个用\0的,如果是判断字符串结束,那些……
[/Quote]恩,太绝对了,呵呵,但我看了很多的笔试题目大部分确实写的‘/0’,所以我被搞晕了
追求执着 2011-09-04
  • 打赏
  • 举报
回复
路过,学习!
加载更多回复(9)

65,199

社区成员

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

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