加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组语法混淆

发布时间:2020-12-16 09:58:15 所属栏目:百科 来源:网络整理
导读:众所周知,数组名称衰减为指针,如[i]等同于*(a i).我偶然发现一个问题,要求我预测输出: int main(void){ printf("%c","abcdefgh"[4]); return 0;} 他们说的答案是e,他们给出的理由是[4]被转换为*(a 4),其中a是类似行上的数组a的基地址,我们可以找到上述问题
众所周知,数组名称衰减为指针,如[i]等同于*(a i).我偶然发现一个问题,要求我预测输出:

int main(void)
{
   printf("%c","abcdefgh"[4]);
   return 0;
}

他们说的答案是e,他们给出的理由是[4]被转换为*(a 4),其中a是类似行上的数组a的基地址,我们可以找到上述问题的输出.

但是我怎么理解,因为[i]衰变成*(a i),因为编译器会这样对待它但是在上面的代码片段中我们将如何以及为什么要对待“abcdef”[4]这个?

解决方法

如果我说你甚至可以写下面的方式,你会想到更多:)

printf( "%cn",4["abcdefgh"] );

C中的字符串文字具有字符数组类型.因此字符串文字“abcdefgh”具有char [9]类型.它还包括终止零.

在表达式数组中,正确地提到了衰减到指向其第一个元素的指针.所以字符串文字衰减到一个char *类型的指针,指向文字的第一个字符’a’

根据C标准(6.5.2.1阵列下标)

2 A postfix expression followed by an expression in square brackets []
is a subscripted designation of an element of an array object. The
definition of the subscript operator [] is that E1[E2] is identical to
(*((E1)+(E2))). Because of the conversion rules that apply to the
binary + operator,if E1 is an array object (equivalently,a pointer
to the initial element of an array object) and E2 is an integer,
E1[E2] designates the E2th element of E1 (counting from zero).

因此,该表达式(*((E1)(E2)))不取决于初始记录是E1 [E2]还是E2 [E1]

返回到您的代码发行版,您将在此表达式中拥有该代码

4["abcdefgh"]

字符串文字转换为指向其第一个字符的指针.你可以想象这就好

char *p = "abcdefgh";

你会得到的

4 [p]相当于*(4 p)并导致字符’e’的左值

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读