【发布时间】:2012-05-11 11:01:30
【问题描述】:
在某些编程语言中,我看到(例如):
x := y
这个:= 操作符通常叫什么,它有什么作用?
【问题讨论】:
-
您遗漏了 ::=。这出现在语言语法中,表示“被定义为等于”。
标签: syntax programming-languages operator-keyword colon-equals
在某些编程语言中,我看到(例如):
x := y
这个:= 操作符通常叫什么,它有什么作用?
【问题讨论】:
标签: syntax programming-languages operator-keyword colon-equals
这是 Python 3.8 中的新运算符,实际上在 BDFL Guido van Rossum 的提前退休中发挥了作用。
正式地,运算符允许所谓的“赋值表达式”。非正式地,算子被称为“海象算子”。
它允许在评估表达式的同时进行赋值。
所以这个:
env_base = os.environ.get("PYTHONUSERBASE", None)
if env_base:
return env_base
可以简写为:
if env_base := os.environ.get("PYTHONUSERBASE", None):
return env_base
https://www.python.org/dev/peps/pep-0572/#examples-from-the-python-standard-library
【讨论】:
该符号被称为“成为”,由 IAL(后来称为 Algol 58)和 Algol 60 引入。它是为变量赋值的符号。将x := y; 读作“x 变为 y”。
使用 ":=" 而不是 "=" 进行赋值是数学上的挑剔;对于这样的观点,“x = x + 1”是荒谬的。其他当代语言可能使用左箭头进行赋值,但这在许多字符集中并不常见(作为单个字符)。
Algol 68 进一步区分识别和赋值; INT the answer = 42; 表示“答案”被声明为等同于 42(即,是一个常数值)。在INT the answer := 42; 中,“答案”被声明为一个变量,最初赋值为 42。
还有其他分配符号,例如+:=,发音为 plus-and-becomes; x +:= y 将 y 添加到 x 的当前值,并将结果存储在 x 中。
(空格没有意义,因此可以插入“到”标识符中,而不必与下划线混淆)
【讨论】:
在所有支持运算符:= 的语言中,它表示赋值。
:= 的语言中,= 运算符通常表示相等比较。= 表示赋值的语言中,== 通常用于相等比较。
:=是指=吗?
我不记得在任何语言中:= 与= 的含义相同。
在 MySQL 中,:= 和 = 都用于 assignment,但是它们不可互换,选择正确的取决于上下文。为了使事情更加混乱,= 运算符也用于comparison。将= 解释为赋值还是比较也取决于上下文。
【讨论】:
:= 进行分配。这往往会在 Algol 的后裔语言中继续存在:Pascal、Modula-2 等。
PL/I 拥有(拥有?)= 和 :=。 = 用于赋值和比较——编译器试图根据上下文找出你的意思。当/如果它决定在你真正指派的地方进行比较,你可以使用:= 来强制分配。
例如,考虑x=y=0; 在 C 中(例如),这意味着“将 0 分配给 y,然后将结果(也是 0)分配给 x。”
在 PL/I 中,这意味着将 y 与 0 进行比较,然后将该比较的布尔结果分配给 x(即,相当于 C 中的 x = y == 0;)。如果你(理智,不像 PL/I 的设计者)想要表示“将 0 分配给 x 和 y”,你会使用x = y := 0;(或x := y := 0;)。
【讨论】:
许多语言都使用通用运算符。通常,= 保留用于变量赋值,如果单独使用,则不应在数学上下文中查看。通过== 测试某些语言(如 Java 和 Bash)中的平等性
【讨论】:
我通常更多地在伪代码中看到它,这意味着分配。因此 x := y 表示“将 x 的值设置为 y 的值”,而 x = y 表示“x 的值是否等于 y 的值?”
【讨论】: