编程语言 / 赋值 / 运算符 · 2023年 10月 12日 0

赋值运算符

65 次浏览

赋值是编程语言基本操作,即便如此,赋值运算符也并不唯一。大部分编程语言"="是赋值,"=="是相等。一个常见的疑问是,赋值运算符"="和数学的相等是一个符号,这会产生误解吗?

=和==

在数学或者计算机科学中,判断相等相比于赋值,个数少的可怜。按照编码理论,出现次数越多的符号用最少的字符编码更有利。用"="当做赋值,"=="相等也是有道理的。

  • C/C++可能误用赋值为逻辑判等,但编译器可能不会理会,因为赋值的结果为整型依然被当做合法的逻辑值。这很灵活,字符串结尾判断代码相当简洁,但可能被误用。
  • Java作为一门安全设计的语言,可能的误用,编译器会直接报警。

不同的赋值运算符

  • 大部分主流语言支持”=”作为赋值,也支持复合赋值运算符(如+=, -=, *=, /=, %=)
    • C/ObjC/C++/Python/C#/Java/JavaScript/Ruby/Swift/仓颉/Go/Rust/VB.NET/PHP/Kotlin 等均支持。
    • Shell/Batch批处理/VB6 支持"="赋值,但不支持复合赋值运算符。
    • VB 赋值语句开头可以额外增加 Let 显式指示。
    • C#复合赋值与C语言有差异,它是调用相应方法实现:a += b相当于a = a.Add(b).
    • PHP还支持 ".=" 实现字符串拼接。
  • 另外一种赋值运算符:=,最早起源于Algol语言,Go语言也使用这种赋值方式做函数内变量无需声明快速赋值。Pascal和Ada都采用:=作为赋值,把=当成相等比较运算符,这与上面"=="作为相等判断不同。

赋值运算符前后的空格

  • 编译型语言一般可以忽略空白字符,会忽略赋值运算符左右的空格。
  • Shell语言用于命令控制,赋值左右不能随便加空格。

连续赋值

  • C语言支持形如 i = j = k = 0, 简化了多个变量初始化。主流编程语言均支持,如C/ObjC/C++/Java/C#/Python/Ruby等。
  • Pascal 不支持连续赋值。

赋值和相等比较的误用

  • C/ObjC/C++
    if (x = 1) 可能不是预期,但GCC/G++默认不报警,打开-Wall后提示:
    "建议在用作真值的赋值语句前后加上括号 [-Wparentheses]"

一些古老的复合赋值运算符

  • C语言早期,曾出现过 =+ 代表当今 += 加法复合赋值运算符(=-也类似)。C标准已经废弃了这种做法。