增量赋值
编辑增量赋值(或复合赋值)是某些编程语言(尤其是从 C 派生的语言)中赋予某些赋值运算符的名称。 增广赋值通常用于替换语句,其中运算符将变量作为其参数之一,然后将结果赋值回同一变量。 一个简单的例子是 x += 1,它被扩展为 x = x + 1。类似的结构通常可用于各种二元运算符。
通常,在提供此功能的语言中,大多数可以将变量作为其参数之一并返回相同类型结果的运算符都有一个增强的赋值等价物,可以将结果赋值回变量,包括算术运算符、bitshift 运算符和位运算符。
讨论
编辑例如,在许多程序中都可以找到以下语句或它的一些变体:
x = x + 1
这意味着找到存储在变量 x 中的数字,将其加 1,并将加法的结果存储在变量 x 中。 这看起来很简单,但它可能效率低下,因为如果编译器无法识别表达式的两个部分是相同的,则必须查找变量 x 的位置两次:x 可能是对某个数组元素的引用或 其他复杂性。 相比之下,这是增强赋值版本:
x += 1
对于这个版本,编译器没有理由无法生成只查找变量 x 的位置一次并就地修改它的代码,当然前提是机器代码支持这样的序列。 例如,如果 x 是一个简单变量,则机器代码序列可能类似于
加载 x 添加 1 存储 x
并且将为两种形式生成相同的代码。 但是如果有一个特殊的操作码,它可能是
MDM x,1
意思是通过向 x 加 1 来修改内存,优化编译器将为两种形式生成相同的代码。 一些机器代码提供 INC 和 DEC 操作(加或减一个),其他机器代码可能允许除 1 以外的常量。
更一般地,形式是
x ?= 表达式
在哪里? 代表一些运算符(不总是+),可能没有特殊的操作码来帮助。 仍然有可能,如果 x 是一个复杂的实体,编译器将被鼓励在访问 x 时避免重复,当然,如果 x 是一个冗长的名称,则需要更少的输入。 最后一个是通过 Burroughs B6700 系统提供的 ALGOL 编译器中类似功能的基础,使用波浪符号代表被分配给的变量,因此
长名:=x + sqrt(长名)*7;
会成为
长名:=x + sqrt(~)*7;
等等。 这比 x:=~ + 1 更通用; 生成最佳代码将仍然是编译器的职责。
语义
编辑在面向表达式的编程语言(例如 C)中,赋值和扩充赋值是具有值的表达式。 这允许它们在复杂的表达式中使用。 然而,这会产生难以阅读或理解的符号序列,更糟糕的是,错误输入很容易产生不同的乱码序列,尽管编译器可以接受这些乱码,但不会产生预期的结果。 在其他语言中,例如 Python,赋值和扩充赋值是语句,而不是表达式,因此不能用于复杂表达式。 例如,以下是有效的 C,但不是有效的 Python:
a += b += c
与赋值一样,在这些语言中,增广赋值是一种右结合赋值形式。
与 C 不同,C++ 的复合赋值表达式求值为左值。作为左值,它可以写在其他赋值语句的左侧:
整数 x = 11;(x *= 2) += 3; // 将 x 设置为 25
计算分配位置
在 C、C++ 和 Python 等语言中,赋值位置包括函数调用的增强赋值被强制只调用函数一次。 即在声明中:
我的数组 [f1()] += 1
函数 f1 被强制只调用一次。
如果一种语言通过宏扩展来实现增强赋值:
我的数组[f1()] = 我的数组[f1()] + 1
然后 f1 被调用两次。
按语言
编辑C 后代
在 C、C++ 和 C# 中,赋值运算符是 =,其扩充如下:
这些中的每一个在所述语言中都称为复合赋值运算符。
支持语言
编辑以下列表虽然不完整或包罗万象,但列出了一些支持增强赋值运算符的主要编程语言。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/195892/