gpt4 book ai didi

c - 协调 C 中数组的声明和使用语法

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:09 28 4
gpt4 key购买 nike

在 C 中,“数组语法”只是指针语法的语法糖。那是a[4] 转换为 *(a+4)

但这并不总是正确的。

当然下面是​​荒谬的,

int a[4] = {1,2,3,4};
int *(a+4) = {1,2,3,4};

这不会编译。

无论如何,我想知道是否有人对这种差异有任何见解。对我来说,拥有两类不同的语法似乎很奇怪。一份用于声明,一份用于实际使用。

这是怎么回事?

最佳答案

C 的(公认的令人困惑的)声明语法背后的一般灵感是“声明遵循使用”。所以,例如:

int *ptr;

恰好将ptr声明为int*类型的对象(这就是为什么有些人更喜欢写int* ptr;),但如果您遵循语法,它真正的意思是 *ptrint 类型。

但是不要太字面地理解“声明跟随使用”的想法。这不是实际的语言规则,并不适用于所有情况。这是理解 C 的声明语法的良好开端,但绝不是全部。

对于一个简单的数组定义:

int arr[10];

你可以说 arr[10]int 类型。并且表达式 arr[10] int 类型,但它当然指的是一个不存在的数组元素。

数组和指针不等价。数组索引运算符是涉及指针算术运算的“语法糖”:x[y] 表示 *(x+y)。但这仅适用于数组索引运算符 []。它不适用于数组声明语法。

许多(但不是全部)形式的声明都可以通过将声明视为表达式来理解,类型名称告诉您该表达式的类型。但并不是所有的表达式都可以转化为声明。没有对应于表达式 x+y 或表达式 *(x+y) 的声明。

关于数组和指针,最重要的是要记住它们是不同的东西。索引运算符 [] 被定义为对指针值进行操作(该指针必须指向数组对象的元素)。在大多数但不是所有上下文中,数组类型的表达式隐式转换为指向数组第一个元素的指针;异常(exception)情况是它是一元 & 的操作数、一元 sizeof 的操作数,或者当它是用于初始化数组的初始化程序中的字符串文字时。

C 声明的含义由语言语法决定。 “使用后声明”不是该语法的一部分。

关于c - 协调 C 中数组的声明和使用语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com