C语言中单引号和双引号的区别

3
我很好奇这段代码的含义:
int a = 'ftyp';          // a == 1718909296
int b = *((int*)"ftyp"); // b == 1887007846

我的问题是:为什么a != b?

1
你应该首先解释为什么假设a == b。 - 2501
4
大端序和小端序是两种不同的字节序方式。当使用十六进制时,它们变得更加明显:a0x66747970,而 b0x70797466 - Cornstalks
非常感谢。这对我来说是极大的帮助。 - codeDom
1个回答

8
int a = 'ftyp';          // a == 1718909296

a设置为多字符常量,其具有实现定义的值。标准未定义a的值。有关更多详细信息,请参见C或C++中的单引号与双引号

int b = *((int*)"ftyp"); // b == 1887007846

在it技术方面,由于违反了严格别名规则,会导致未定义的行为。

期望a == b是不合理的。


1
不,这里的问题不是别名。只有当一个别名对象被修改时,别名才会成为问题。然后编译器可能会做出错误的假设,认为通过指针看到的对象没有改变。真正的问题在于可能的错位。 - Jens Gustedt
@JensGustedt 如果您不使用兼容的对象,那么行为是否未定义。 - 2501
@JensGustedt,根据C+11标准3.10/10:如果程序试图通过非以下类型之一的glvalue访问对象的存储值,则行为是未定义的。随后的任何子句都不允许通过int *访问字符串字面值的值。 - R Sahu
引用C规范而不是C++对于C语言问题会更有说服力。我没有看到C++的引用支持这是一个别名问题,即使它是@Jens Gustedt中对齐问题的未定义行为。 - chux - Reinstate Monica
OP 正试图从 char* 转换为 int* 并使用 int b = *((int*)"ftyp") 进行反引用。因此,在允许该指针转换的系统上,由于对齐违规,仍可能导致 *(int_pointer) 失败。 - chux - Reinstate Monica
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接