在C和C++(以及其他几种语言)中,字符和字符串常量中的水平制表符(ASCII代码9)以转义形式表示为'\t'和"\t".不过,我经常键入字符串文字例如在转义字符制表"A B"(存在王全凯一个TAB A和B),以及至少铛++似乎不打扰-字符串似乎等同于"A\tB".我更喜欢未转义的版本,因为长缩进的多行字符串在源代码中更易读.
现在我问自己这在C和C++中是否通常是合法的,或者只是由我的编译器支持.非字符表制表符在字符和字符串常量中的可移植性如何?
令人惊讶的是,我无法找到这个看似简单的问题的答案,无论是Google还是stackoverflow(我刚发现这个含糊不清的相关问题).
Mik*_*our 56
是的,您可以在字符串或字符文字中包含制表符,至少根据C++ 11.允许的字符包括(强调我的意思):
除双引号,反斜杠或换行符之外的源字符集的任何成员
"\
(来自C++ 11标准,附件A.2)
源字符集包括:
空格字符,表示水平制表符,垂直制表符,换页符和换行符的控制字符,以及以下91个图形字符
(来自C++ 11标准,第2.3.1段)
更新:我刚刚注意到你问的是两种不同的语言.对于C99,答案也是肯定的.措辞不同,但基本上说同样的事情:
在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或[...]表示.
源和执行字符集都包含的位置
控制表示水平制表符,垂直制表符和换页符的字符.
ric*_*ici 27
将制表符直接放入字符串或字符文字中是完全合法的.C和C++标准要求源字符集包含制表符,字符串和字符文字可以包含源字符集中的任何字符,但反斜杠,引号或撇号(视情况而定)和换行符除外.
所以它是便携式的.但这并不是一个好主意,因为读者无法区分不同类型的空白.对于文本编辑器,邮件程序等来说,重新格式化标签也是很常见的,因此可以在这样的操作过程中将错误引入到程序中.
如果在输入中输入一个选项卡,那么你的字符串将包含一个文字制表符,它将保留一个制表符 - 它不会被神奇地翻译成\t内部.
编写代码同样如此 - 您可以在字符串中嵌入文字制表符.但是,考虑一下:
T T T <--tab stops
012345012345012345012345
foo1 = 'a\tb';
foo2 = 'a b'; // pressed tab in the editor
foo3 = 'a b'; // hit space twice in the editor
Run Code Online (Sandbox Code Playgroud)
除非你把光标放在之间的空白a,并b与检查多少个字符都在里面,基本上没有办法,以确定是否有在那里一个标签或实际空格字符.但随着\t版本,它立即显示为一个选项卡.
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |