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