当整数在C语言中添加到字符串常量时,答案是什么?

时间:2018-01-05 14:10:26

标签: c string pointer-arithmetic

char c=8+"ab"; //输出c=112并带有警告

int c=8+"ab"; //输出c=4195952并带有警告

char c=8+"a"; //输出为c=112(与字符串常量中的许多字符相同)并带有警告

如何计算c值? 请解释一下。

4 个答案:

答案 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