赋值是编程语言基本操作,即便如此,赋值运算符也并不唯一。大部分编程语言"="是赋值,"=="是相等。一个常见的疑问是,赋值运算符"="和数学的相等是一个符号,这会产生误解吗?
=和==
在数学或者计算机科学中,判断相等相比于赋值,个数少的可怜。按照编码理论,出现次数越多的符号用最少的字符编码更有利。用"="当做赋值,"=="相等也是有道理的。
- 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标准已经废弃了这种做法。