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



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;

最新更新