为什么int a = 'adf';
在C中编译并运行?
答案 0 :(得分:8)
文字'adf'
是多字节字符常量。它的价值取决于平台。不要使用它。
例如,某个平台的32位无符号整数可以取值0x00616466
,而另一个平台可以取0x66646100
,而另一个平台可能是0x84860081
。 ..
答案 1 :(得分:2)
正如Kerrek所说,这是一个多字节字符常量。它的工作原理是因为每个字符占用8位。 'adf'是3个字符,即24位。 int
通常足以包含此内容。
但上述所有内容都依赖于平台,并且可能因架构而异。这种东西仍然用在古老的Apple代码中,不太记得在哪里,虽然文件创建者代码响铃。
请注意"
和'
之间的语法差异。
char *x = "this is a string. The value assigned to x is a pointer to the string in memory"
char y = '!' // the value assigned to y is the numerical character value of the character '!'
char z = 'asd' // the value of z is the numerical value of the 'string' data, which can in theory be expressed as an int if it's short enough
答案 2 :(得分:0)
它的工作原理只是因为“adf”是3个ASCII字符,因此长3个字节,您的平台是24位或更大的系统。例如,它会在16位系统上失败。
值得记住的是,虽然sizeof(char)总是会返回1,但依赖于平台和编译器,可以将超过1个字节的内存空间分配给char,因此
struct st
{
int a;
char c;
};
当你:
sizeof(st)
许多32位系统将返回8
。这是因为系统会将char c
的单个字节填充为4个字节。
答案 3 :(得分:-1)
ASCII。每个角色都有一个数值。如果您需要更多信息,请参阅本教程的中间部分http://en.wikibooks.org/wiki/C_Programming/Variables
Edit_的 _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____ 强>
char letter2 = 97; /* in ASCII, 97 = 'a' */
有些人认为这是非常糟糕的做法,如果我们用它来存储一个字符,而不是一个小数字,如果有人读你的代码,大多数读者被迫查找哪个字符对应的数字97在编码方案中。最后,letter1和letter2存储了相同的东西 - 字母“a”,但第一种方法更清晰,更容易调试,而且更直接。
值得一提的是,数字的字符与其对应的数字不同,即“1”不等于1.