Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
如何确定将多字符char常量赋给char变量的结果?_C - Fatal编程技术网

如何确定将多字符char常量赋给char变量的结果?

如何确定将多字符char常量赋给char变量的结果?,c,C,为什么char变量从'ab'赋值得到'b',而不是'a' char c = 'ab'; printf("c: %c\n", c); 印刷品: c: b 因为'ab'具有类型int,而char只能保存一个字节。根据C11标准(§6.4.4.4“字符常量”al10 p69),整数多字符常量的值是实现定义的: 10-[…]包含多个字符的整数字符常量的值(例如。, “ab”),或包含不映射到单个字节的字符或转义序列 执行字符,是实现定义的。[……] 根据标准,它是实现定义的。从6.4.4.4字符常

为什么char变量从'ab'赋值得到'b',而不是'a'

char c = 'ab';

printf("c: %c\n", c);
印刷品:

c: b

因为
'ab'
具有类型
int
,而
char
只能保存一个字节。

根据C11标准(§6.4.4.4“字符常量”al10 p69),整数多字符常量的值是实现定义的:

10-[…]包含多个字符的整数字符常量的值(例如。, “ab”),或包含不映射到单个字节的字符或转义序列 执行字符,是实现定义的。[……]


根据标准,它是实现定义的。从6.4.4.4字符常数:

整型字符常量的类型为int。整型字符常量的值 包含映射到单字节执行字符的单个字符是 被解释为整数的映射字符表示形式的数值。 包含多个字符的整数字符常量的值(例如。, “ab”),或包含不映射到单个字节的字符或转义序列 执行字符,是实现定义的。


正如前面的答案所说,这是一个实现

我的gcc将“ab”处理为int。以下代码:

printf( "sizeof('ab') = %zu \n", sizeof('ab') );
printf( "'ab' = 0x%08x \n", 'ab' );
printf( "'abc' = 0x%08x \n", 'abc' );
印刷品:

sizeof('ab') = 4
'ab' = 0x00006162
'abc' = 0x00616263
在代码中,行:

char c = 'ab';
可以认为:

char c = (char)(0x00006162 & 0xFF);

所以c得到'ab'最后一个字符的值。在本例中,它是“b”(0x62)。

稍后编辑:我的答案与之前的答案是互补的,非常清楚地表明这是特定于实现的行为。我的印象是OP想知道,考虑到这一点,为什么编译器选择“b”而不是“a”。对不起,如果我的回答令人困惑

持久性。这就是为什么你得到的是“b”而不是“a”。 因为它是如何在你的机器内存中表现出来的。 你的机器可能是小endian

在sparc、mipsbe或手臂上试试,你可能会得到“a”而不是“b”


无论如何,我希望您在实际的生产代码中不要依赖于此。

@ouah,怎么不呢?它表示,它为多字符文字指定的
int
值取决于实现。@ouah单字符常量的值是多少并不重要,“b”仍然表示为“b”。这个答案确实回答了为什么“b”而不是“a”的问题(也就是说,这取决于实现),而你的答案根本没有触及这个问题。@JimBalter实际上是OP编辑了他的问题,添加了而不是“a”,这稍微改变了原问题的意图。这并没有回答问题,这就是为什么它得到的是“b”而不是“a”,而不是为什么它得到的是“b”而不是“ab”。@JimBalter这个问题是经过编辑的,在我回答时没有答案,而不是“a”。由于这是一个C问题,
'a'
'b'
也有类型
int
。对不起,我没有注意到编辑。但是请调整你的答案以适应当前的问题。不仅仅是冗长。即使值本身中的字符顺序也是未定义的。具有相同endian的不同编译器使用不同的表示(例如GCC与Visual Studio)。但我认为这已经被以前的答案解决了。我只是想弄清楚为什么OP在测试中会得到“b”而不是“a”。编译器可能会选择一种简单的表示和访问方法,具体取决于它所运行的平台。C90和C99标准具有相同的规则。