Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否必须转义C和C+中的制表符+;? 在C和C++中(以及其他几种语言),字符和字符串常量中的水平制表符(ASCII代码9)以“代码>”、“T”/“代码”和“代码>”\“的形式表示。但是,我经常以字符串文字形式键入未替换的制表符字符,例如在“ab”(betreenA和B中有一个选项卡),并且至少clang++似乎不麻烦-字符串似乎相当于“A\tB”。由于长缩进的多行字符串在源代码中可读性更好,因此我更喜欢未缩放的版本 现在我问自己,C和C++中是否普遍合法,或者只是由编译器支持。字符和字符串常量中的未转换制表器的可移植性如何_C++_C - Fatal编程技术网

是否必须转义C和C+中的制表符+;? 在C和C++中(以及其他几种语言),字符和字符串常量中的水平制表符(ASCII代码9)以“代码>”、“T”/“代码”和“代码>”\“的形式表示。但是,我经常以字符串文字形式键入未替换的制表符字符,例如在“ab”(betreenA和B中有一个选项卡),并且至少clang++似乎不麻烦-字符串似乎相当于“A\tB”。由于长缩进的多行字符串在源代码中可读性更好,因此我更喜欢未缩放的版本 现在我问自己,C和C++中是否普遍合法,或者只是由编译器支持。字符和字符串常量中的未转换制表器的可移植性如何

是否必须转义C和C+中的制表符+;? 在C和C++中(以及其他几种语言),字符和字符串常量中的水平制表符(ASCII代码9)以“代码>”、“T”/“代码”和“代码>”\“的形式表示。但是,我经常以字符串文字形式键入未替换的制表符字符,例如在“ab”(betreenA和B中有一个选项卡),并且至少clang++似乎不麻烦-字符串似乎相当于“A\tB”。由于长缩进的多行字符串在源代码中可读性更好,因此我更喜欢未缩放的版本 现在我问自己,C和C++中是否普遍合法,或者只是由编译器支持。字符和字符串常量中的未转换制表器的可移植性如何,c++,c,C++,C,令人惊讶的是,无论是Google还是stackoverflow,我都找不到这个看似简单的问题的答案(我只是找到了一个模糊相关的问题)。是的,至少根据C++11,可以在字符串或字符文本中包含制表符。允许的字符包括(我强调): 源字符集的任何成员 双引号“、反斜杠\或换行符 (摘自附件A.2) 源字符集包括: 空格字符、表示水平制表符、垂直制表符、换行符和新行的控制字符,以及以下91个图形字符 (摘自第2.3.1段) 更新:我刚刚注意到您询问的是两种不同的语言。对于C99,答案也是肯定的。措辞不同,

令人惊讶的是,无论是Google还是stackoverflow,我都找不到这个看似简单的问题的答案(我只是找到了一个模糊相关的问题)。

是的,至少根据C++11,可以在字符串或字符文本中包含制表符。允许的字符包括(我强调):

源字符集的任何成员 双引号
、反斜杠
\
或换行符

(摘自附件A.2)

源字符集包括:

空格字符、表示水平制表符、垂直制表符、换行符和新行的控制字符,以及以下91个图形字符

(摘自第2.3.1段)

更新:我刚刚注意到您询问的是两种不同的语言。对于C99,答案也是肯定的。措辞不同,但基本上是一样的:

在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员表示

其中,源和执行字符集都包括

表示水平制表符、垂直制表符和 表单提要


<> P>将一个制表符直接放入字符串或字符文字是完全合法的。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

T当您按TAB键时,您将获得系统映射到该键的任何代码点。该代码点可能是也可能不是程序运行的系统上的选项卡。当您输入文本时,编译器会将其替换为目标系统的适当代码点。因此,如果您希望确保获得ab在程序运行的系统上,使用\t。这是它的工作。

是否检查了编辑器设置?有时,选项卡会自动转换为一些白色空格。每当遇到类似的问题时,会出现两个问题:“你能吗?”和“你应该吗?”?“通常后者是重要的……”卡洛利霍瓦特:我认为两者同等重要,至少在编程方面是如此。要真正精通任何编程语言,您总是需要“法律”知识和“道德”知识。@EvdzhanMustafa:不,这样您就可以在源代码中的任何地方使用
\t
。此语法仅适用于字符串和字符文本。你可能在想,这是源代码和预处理之间的一种关系。@tobi303我自己编写了编辑器,所以是的,我确信一个选项卡就是一个选项卡:)“它不会在内部神奇地被翻译成\t”-你知道
\t
什么时候被翻译成选项卡吗?(以及知道这是否是一个有用的事实)在编译时。
\t
仅存在于代码的文本版本中。编译完成后,二进制/对象文件将包含ascii字符9(一个字节),而不是
\t
(两个字节)。这是过程的两个端点。我的编辑器显示空格、空格和制表符是完全不同的there@Jongware:它发生在翻译阶段5,也就是说,在预处理之后和相邻字符串文本的串联之前。(“5.字符常量和字符串文本中的每个源字符集成员和转义序列将转换为执行字符集的相应成员;如果没有相应的成员,则将其转换为除空(宽)字符以外的实现定义的成员。”)知道这是否有用是knower:)的函数,也是原始字符串中的函数。@Jarod42:事实上,原始字符串文字可以包含源字符集中的任何内容,除了您为其选择的分隔符序列。感谢您的快速回答和标准中的引号。因此理论上,字符串可以具有非转义\0(即,源文件中的0x00字节)?@AndreasBonini:不,这不是源字符集的成员。同意“这不是一个好主意”。假设源代码可以嵌入原始回车符
'\r'
(或垂直制表符,表单提要)在一个字符串中,现在在一个代码列表中对它们进行解密会很有趣。@chux它们可以,至少VT和FF。我同意它们不应该。翻译pha