char c=8+"ab";
//输出c=112
并显示警告
int c=8+"ab";
//输出c=4195952
并显示警告
char c=8+"a";
//output c=112
(与字符串常量中的许多 caharacter 相同(,并带有警告
这里如何计算 c 值?请解释一下。
"ab"
是一个char *
。您可以向指针添加整数偏移量,以便8 + "ab"
是字符串末尾几个字符之后的char *
指针。
然后(这将警告您(您可以强制将指针转换为整数类型。所以int c=8+"ab"
给你指针的低32位(假设32位int
(,char c=8+"ab"
只给你最低的8位。
实际值是未定义的,在这里没有用,只是不要这样做。
0+"ab"
是一个定义良好的指针添加。 结果:指向第 0 个元素的char *
指针'a'
。
1+"ab"
是一个定义良好的指针添加。 结果:指向元素 1 的char *
指针:'b'
。
2+"ab"
是一个定义良好的指针添加。 结果:指向元素 2 的char *
指针:' '
。
3+"ab"
是一个定义良好的指针添加。 结果:指针 1 char *
通过2+"ab"
。
8+"ab"
没有明确定义的指针加法,因为答案不在字符串文字或过去。结果是未定义的行为 (UB(。
这里如何计算 c 值?
由于所有OP的示例都使用8+"ab";
. 都是 UB。 报告的结果没有指定的含义。
您正在导致未定义的行为。
正如其他人已经解释的那样,这基本上是一个指针算术,根据规范,C11
,第 §6.5.6 章
[...]如果两个指针 操作数和结果指向同一数组对象的元素,或者指向最后一个之后的元素 元素的数组对象,计算不得产生溢出;否则, 行为未定义。
您的指针算术使结果远远超过"一个过去最后一个"元素",因此您调用未定义的行为
让我们考虑一下这个声明
char c=8+"ab";
字符串文字"ab"是类型为 char[3]
的字符数组。
在表达式中8 + "ab"
此数组被隐式转换为指向其第一个字符的指针。因此,表达式的类型为 char *
并指向数组外部,因为数组只有三个元素。
因此,字符由转换为类型char
的数组外部地址初始化,该类型没有意义,并可能导致未定义的行为。
至于字符c
的输出,那么实际上是由于转换
char c = 4195952;