为什么C程序员会使用转义序列(oct / hex)来表示ASCII值而不是小数?
跟进:这与性能或可移植性有关吗?
示例:
char c = '\075';
答案 0 :(得分:5)
您使用八进制或十六进制,因为无法在字符文字或字符串文字中指定十进制代码。 Octal在PDP-11代码中很普遍。现在,使用十六进制可能更有意义,但'\0'
比'\x0'
更紧凑(因此当您终止字符串时使用'\0'
等等。)。
另外,请注意"\x0ABad choice"
没有您可能期望的含义,而"\012007 wins"
可能会这样。 (不同之处在于十六进制转义运行直到遇到非十六进制数字,而八进制转义在最多3位数后停止。要获得预期结果,您需要"\x0A" "Bad choice"
使用'相邻字符串文字级联”。)
这与性能无关,与可移植性无关。写'\x41'
或'\101'
而不是'A'
是降低代码的可移植性和可读性的一种方法。当没有更好的方法来表示角色时,您应该只考虑使用转义序列。
答案 1 :(得分:2)
不,它与性能和可移植性无关。这只是一种方便的方法来定义字符文字,并在字符串文字中专门用于不可打印的字符。
答案 2 :(得分:1)
它与性能和可移植性无关。事实上,您根本不需要任何代码,而不是:
char c = 65;
您可以简单地写一下:
char c = 'A';
但有些字符并不容易打字,例如ASCII SOH,所以你可以写:
char c = 1; // SOH
或任何其他形式,十六进制,八进制,取决于您的偏好。
答案 3 :(得分:0)
它与性能和可移植性无关。简单地说,ASCII字符集(以及它的衍生产品直到UTF)以字节和位组织。例如,32个第一个字符是控制字符,32 = 040 = 0x20,ASCII代码'A'是65 = 0101 = 0x41,'a'是97 = 0141 = 0x61,ASCII代码'0'是48 = 060 = 0x30。
我不知道你,但对我来说'0x30'和0x'41'比手动操作更容易记忆和使用,而不是48和65.
顺便说一下,一个字节恰好代表0到255之间的所有值,即0和0xFF ......
答案 4 :(得分:0)
我不知道这有效。
但我立即得到了一个非常有用的想法。
想象一下,你的内存环境很低,必须使用像unix文件夹权限这样的权限系统。
假设有3组,每组有2个不同的选项,可以被允许或拒绝。
0表示两个选项都不是,
1表示允许第一个选项,
2表示允许第二个选项,
3表示允许。
要存储权限,您可以这样做:
char* bar = "213"; // first group has allowed second option, second group has first option allowed and third has full acces.
但是你有四个字节的存储空间来存储这些信息。
Ofc你可以把它转换成十进制表示法。但那可读性较差。
但现在我知道了......
做的:
char bar = '\0213';
非常易读并且还可以节省内存! 我喜欢它:D