[英]What characters are legal to use in string literals?
我想知道,如果它是合法的在C 硬是把ascii
字符,如TAB
, BEL
和ESC
直接在一个字符串。
在Stackoverflow上无法以纯文本显示字符,因此我不得不截取屏幕截图。
没有图形表示的字符使用插入符号表示,并在屏幕截图中以紫色突出显示。 第7
行还有一个TAB
字符,用于缩进文本。
使用gcc -std=c99 -pedantic
编译时不会发出任何警告,但是它真的可以完全移植吗?
这不是我要用于任何严肃程序的东西。 我只是好奇标准是否允许它。
可以在程序源代码中出现的可移植字符就是这些:
拉丁字母的26个大写字母
ABCDEFGHIJKLM NOPQRSTUVWXYZ
拉丁字母的26个小写字母
abcdefghijklm nopqrstuvwxyz
10个十进制数字
0 1 2 3 4 5 6 7 8 9
以下29个图形字符
! " # % & ' ( ) * + , - . / : ; < = > ? [ \\ ] ^ _ { | } ~
资料来源:C标准,任何版本。
实现必须接受这些字符,并且允许接受任何其他字符。
如果反斜杠立即在文字换行符(不是\\n
)之前,则反斜杠和换行符都将被删除。 线可以像在三边形之间除在任何地方一样进行拆分(如果三边形被反斜杠-换行符序列分割,则该序列将被删除,但三边形保持不变)。
字符串文字(在可移植代码中)允许使用文字制表符,并且语义与\\t
相同。 C11(n1570)6.4.5 p1指出,“源字符集的任何成员(双引号除外"
,反斜杠\\
或换行符除外)都可以是字符串文字的一部分,而制表符则是源字符集(同上,5.2.1 p3)。
转义字符( \\e
,ASCII 0x1b)不是源字符集的一部分,甚至可能根本不存在(在非ASCII系统上)。 尽管\\f
是C标准的一部分,但对于换页也是如此。 这些字符不能随便使用。
一个实现可以自由接受它喜欢的任何字符(除了标准的最低要求),从源字符集到执行字符集的映射是实现定义的(一个实现可以将源代码中的不同字符映射为相等)。字符)。
以空值结尾的字符串只是一些8位值,根据其有符号性,它们可以是0-255或-128-127。
当您将字节发送到类似终端的内容时,完全取决于终端如何处理字节。 某些像“ a”-“ z”的字节可能是标准字节,但前提是您假设使用8位字符编码。 诸如“€”之类的其他字节可能只能使用正确的字符集正确显示。
最终,我们有了那些终端控制字节来控制光标和响铃。 最终由终端来处理这些字节,但是写入它们仍然是有效的C代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.