C “什么是”呢;表达式的语法;

C “什么是”呢;表达式的语法;,c,C,我正在阅读由K&R编写的C编程语言,我被一条关于声明的语句卡住了: 变量声明的语法模仿变量可能出现的表达式的语法 这是我从上述声明中了解到的: 当我们声明一个变量(例如int a)时,这意味着当在表达式中使用该标识符(a)时,它将返回指定类型的值(int) 我说得对吗?表达式的语法到底是什么意思?让我们看几个例子 与 您可以在表达式中使用*A,它的类型为int,因此A必须是指向int的指针 与 您可以在表达式中使用A[i],它的类型为int,因此A必须是int的数组 但您可以构造更复杂的声明:

我正在阅读由K&R编写的C编程语言,我被一条关于声明的语句卡住了:

变量声明的语法模仿变量可能出现的表达式的语法

这是我从上述声明中了解到的:

当我们声明一个变量(例如
int a
)时,这意味着当在表达式中使用该标识符(
a
)时,它将返回指定类型的值(
int


我说得对吗?表达式的语法到底是什么意思?

让我们看几个例子

您可以在表达式中使用
*A
,它的类型为
int
,因此
A
必须是指向
int
的指针

您可以在表达式中使用
A[i]
,它的类型为
int
,因此
A
必须是
int
的数组

但您可以构造更复杂的声明:

您可以在表达式中使用
((A))
,它将具有类型
int
,因此
A
必须是
int

您可以在表达式中使用
*A[i]
,它的类型为
int
,因此
A

  • 必须是一个数组
  • 它的元素必须是指向
    int
因此
A
必须是指向
int
的指针数组

同样地

int (*A)[100];
您可以在表达式中使用
(*A)[i]
,它将具有类型
int
,因此
A

  • 必须是指针
  • 它指向的对象必须是
    int
因此
A
必须是指向
int
数组的指针



这就是所谓的“变量声明的语法模仿表达式的语法”:当你声明一个变量时,你会编写一个小表达式,它的结果类型是给定的,通过反向推理,你可以推断出被声明变量的类型

在数学中,语法是指控制数学系统行为的规则,如逻辑中使用的形式语言。“我说得对吗?从技术上说是的,但你只涉及了一个微不足道的案例,而这个案例本身并不值得一个特殊的规则。当一个声明涉及指针、数组、函数及其组合时,这个规则就变得有趣而不平凡了。这里的表达式是*ip varable是ip。@n.m.这是一个非常奇怪的定义。语法控制形式,而不是行为。@EJP行为是直接从形式派生出来的。我不认为
((A))
示例值得包含,但其余的都很好。@JonathanLeffler这是为了说明声明符类似于任意(甚至冗余)的表达式括号是允许的。请解释一下你在表达式中的意思是什么?以及表达式中的“((A)),并且它将具有int类型”,那么A如何必须是int呢?原始的函数表示法指针也同意:
double(*fun)(double)=sin;双d=(*乐趣)(2.1)-演示“声明匹配使用语法”的meme。OTOH,标准C现在允许
double d=fun(2.1),尽管我仍然喜欢显式表示法,以显示我的古老。此外,指向函数的指针可能超出了一开始就在这个概念上苦苦挣扎的人。@Bhaskar
2
是一个类型为
int
的表达式
(2)
也是类型
int
的表达式,
((2))
。可以在值周围使用任意括号。变量也是如此:如果
(x)
具有类型
int
,那么
x
也具有类型
int
int A[100];
int (((A)));
int *A[100];
int (*A)[100];