变量赋值是语句还是表达式?

Posted

技术标签:

【中文标题】变量赋值是语句还是表达式?【英文标题】:Is variable assignment a statement or expression? 【发布时间】:2018-03-04 15:32:10 【问题描述】:

我很熟悉语句会做某事,并且表达式是“构成数量的符号集合”(What is the difference between an expression and a statement in Python?)。我的问题是:当你给一个变量赋值时,这个赋值是一个语句还是一个表达式?

例如(在 C 中):

int x = 5;

【问题讨论】:

请注意,如果您有z = y + (x = 5 + j) * 3;(可能是有效的C),那么更清楚的是,对x 的赋值是更大赋值表达式的一部分,这也是一个语句结束它的分号。 那是一个带初始化的定义。它既不是赋值也不是语句。 【参考方案1】:

好吧,当你说

int x = 5;

这是一个声明,恰好包含一个初始化

但如果你说

x = 5

这是一个表达式。如果你在它后面加上一个分号:

x = 5;

现在它是一个声明

表达式语句可能是 C 程序中最常见的语句类型。表达式语句就是任何表达式,后面有一个分号。所以有很多东西可能看起来像某种其他类型的语句,实际上只是表达式语句。也许最好的例子就是经典

printf("Hello, world!\n");

很多人可能认为这是“打印声明”。但它实际上只是另一个表达式语句:一个由单个函数调用组成的简单表达式

printf("Hello, world!\n")

后跟分号。

【讨论】:

那么如果将语句和表达式分隔的只是一个分号,那么区分两者的目的是什么? @DarienSpringer 对于该语言的普通用户来说,可能没有太多用处。这种区别对于编译器作者和编程语言理论的学生来说非常有趣。理解表达式出现在表达式语句以外的地方也很重要。例如,声明中的初始值设定项是表达式,while() 和其他循环中的条件是表达式,子表达式会出现在更大的表达式中,如 this question 中所述。 @DarienSpringer 对于此类问题,最好先阅读标准。【参考方案2】:

粗略地说,在 C 中;

语句是产生可观察效果的一段代码; 表达式是一种代码结构,它访问至少一个数据项,对该访问(或那些访问)的结果执行一些操作,并产生至少一个结果。一个表达式可以由(较小的)表达式组成。

表达式语句是一个仅用于评估表达式的语句 - 尽管该表达式可能是任意复杂的(包括由其他表达式组成)。还有其他类型的语句,例如跳转语句(例如goto)、标签语句(例如goto 的目标)、做出决策的选择语句(例如switchif)和迭代语句(例如循环)等

类似的声明;

 int x = 5;

定义名为x 的变量并使用表达式5 对其进行初始化。 5 是一个文字值。

如果之前已经声明了x

 x = 5;

是一个简单的表达式语句 - 它的唯一目的是评估赋值表达式。 5 同样是一个值 5 的文字。因此x = 5 是一个表达式,它将x 赋值为5。结果是值5,这就是表达式语句的原因

 printf("%d\n", (x = 5));

都将x 赋值为5 并打印出5

【讨论】:

反例:1; 是一个声明。它不会产生可观察到的效果。因此,实现可以根据抽象机将其删除。这主要是关于可观察到的效果。 sizeof(int) 是一个表达式。它访问任何东西。 (void)5 是一个不产生结果的表达式。对void 函数的所有调用都类似。而且标签不是陈述(见 6.8.1)。

以上是关于变量赋值是语句还是表达式?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中赋值语句有啥作用?

python赋值是啥?

C语言:赋值语句

JAVA -数据类型与表达式---变量与赋值

经典语句

图文解析对象的赋值操作是“传值”还是“传址”