编程基础:编码中 ++ 是什么意思?
那么,你刚开始编程,你想知道人们在变量旁边加上 ++ 是什么意思。它是否像电池一样为变量增加了额外的电量?它是否给该变量带来了更积极的前景?也许它就像在考试中得到 A++ 一样,表明变量的表现非常好?
在本文中,我们将讨论 ++ 在编码时的真正含义、如何使用它,甚至深入研究在并发方面可能想要使用的该运算符的替代方案。
编程中的 ++ 解释
++ 是一种简写形式,用于将数字数据类型的值增加 1。因此,如果您有一个名为candles且其值为 16 的变量,则可以写candles++,这样candles的值就为 17。这比写出candles = candles + 1要容易得多。
在编程中,这称为增加变量,这只是“将该值增加一定量”的俚语。默认情况下,这会将数值增加一。
那么,如果可以按照第二种方式写出来,为什么还要使用 ++ 运算符呢?
- 它可以让你的编码更简洁
- 您只需引用变量一次,而不是两次(++ 称为一元运算符,这意味着您只需要一个值即可使其成为有效表达式)
在不需要时多次引用变量是多余的,任何程序员都知道,冗余是应该始终避免的事情。此外,引用变量的次数越多,输入错误的可能性就越大,从而增加了出错的可能性。
那么,如果你想要将变量减少 1 而不是增加 1,该怎么办?请继续阅读!
编码中- - 是什么意思?
--用于将数值数据类型的值减一。其用法与 ++ 运算符相同。例如,如果burgers 的值为 5,而您想将其减一(大概是通过吃掉该汉堡来实现),您可以输入burgers--,然后值将为 4(您也会因此吃得更饱。)
哪些语言使用 ++ 运算符?
++ 是 C、C++ 和 C# 等基于 C 语言的原生操作符。Java、Javascript 和 PHP 也支持 ++ 操作符。虽然 Swift 过去支持 ++ 和 -- 操作符,但不幸的是,这已被弃用。
哪些语言不使用 ++ 运算符?
截至撰写本文时,Python、Ruby、Lua、Haskell、Rust 和 Elixir 等语言都不支持 ++ 运算符。这可能是由于它们的设计理念(并非所有人都认为 ++ 运算符简单易懂或更具可读性)或因为它们是具有不可变变量的函数式语言,因此递增没有意义。
编码中 ++ 和 + 的区别
要记住的重要一点是 + 是算术运算符,而 ++ 既是算术运算符又是赋值运算符。这是什么意思?嗯,前者会为您计算一个方程式,而后者会计算结果并将其赋给包含新值的变量。
为了帮助说明差异,请考虑以下代码,其中蜡烛等于 10。
int items = candles + 1;
在这种情况下,蜡烛的价值仍为 10,而物品的价值现在等于 11。为什么不呢?因为 + 只是一个算术运算符。就像在数学课上一样,将 a 和 b 相加不会改变 a 和 b 的值。
然而,有些事情并不像数学课那样。例如,在编程中,您可以将新值分配给新变量,甚至可以更新现有变量的赋值。这使得 = 成为赋值运算符。
如前所述,++ 很特殊,因为它既是算术运算符,又是赋值运算符。这意味着candles++将 1 加到candles上,然后更新其赋值以包含该新值。
我可以使用 ++ 来增加二或更多而不是一吗?
不。对于这种情况,您可以使用 += 运算符(如果要减少数字,则使用 -=)。例如,如果您输入burgers += 2,这将使汉堡的数量增加 2。您可以更改数字以调整要增加的值的量。
编码中 ++ 的最佳用例
1. 让你的循环更高效
如果您见过循环,通常会看到 ++ 运算符。循环是一种在代码中重复某些任务而无需反复编写的方法。例如,在 Java 中,这可能看起来像这样:
String[] names = { “John”, “Paul”, “George”, “Ringo” };
for (int index = 0; index < names.length; index++) {
System.out.println(names[index]);
}
此循环将逐个打印出names中的每个名称,如下所示:
John
Paul
George
Ringo
for 循环的语法一开始可能有点复杂。但由于这可能是您在编程中第一次接触 ++,因此让我们来了解一下。如您所见,此 for 循环的声明中有三个表达式,以分号分隔:
第一个是变量声明int index = 0。它用于声明循环从哪里开始。
第二个是变量比较index < name.length。它用于声明循环何时停止。
第三个表达式是增量表达式index++。它用于在每次循环时更新索引
请记住,variable = variable + 1和variable++可以互换。这意味着我们可以假设以这种方式编写相同的 for 循环:
String[] names = { “John”, “Paul”, “George”, “Ringo” };
for (int index = 0; index < names.length; index = index + 1) {
System.out.println(names[index]);
}
由于这种循环在早期编程中相当常见,因此 ++ 运算符节省了大量的输入。它还有助于使循环更具可读性。
现代替代方案:增强 for 循环
一些语言增强了 for 循环语法,可以在内部管理此计数器。例如,在 Java 中,您可以编写:
String[] names = { “John”, “Paul”, “George”, “Ringo” };
for (String name : names) {
System.out.println(name);
}
当您不需要知道当前循环索引时,这是一个很好的简化。
2. 计算数据
另一种常见的情况是跟踪数据时使用 ++。许多应用程序希望跟踪示例的性能和流量指标。它们可能有类似以下方法:
private int visitorCount;
// …
public void visitorVisitsWebsite() {
this.visitorCount++;
}
此方法假设有一个类,例如 VisitorStatistics,用于跟踪有关访客的多个计数器。在这种情况下,我们可以这样做:
public void visitorVisitsWebsite() {
this.visitorCount = this.visitorCount + 1;
}
尽管使用 ++ 更简洁。
在编码中使用 ++ 作为前缀或后缀
++ 运算符有两种使用形式:++变量(前缀运算符)和变量++(后缀运算符)。前缀(++变量)在表达式中使用变量之前增加值,而后缀(变量++)在表达式中使用变量之后增加值。
有什么区别?嗯,使用前缀版本,您可能希望在将值分配给其他内容之前增加该值。例如:
前缀
int x = 5;
int y = ++x;
在这种情况下,x增加到 6,然后 y设置为 6。
后缀
int x = 5;
int y = x++;
在这种情况下,y设置为 5,然后x增加到 6。
这在什么时候会有用?好吧,你可能有一段这样的代码,其中操作顺序很重要:
int a = 32;
int b = a++;
// a is now 33, and b is now 32.
int c = ++a;
// a is now 34, and c is now 34.
需要避免的棘手 ++ 表达式
因为 ++ 读起来和理解起来都相当棘手,所以你应该避免将它用作较大表达式的一部分。尽可能将它放在单独的一行中。考虑一下,与之前的示例相比,下面的代码可读性要好得多:
int a = 32;
int b = a;
a++;
// a is now 33, and b is now 32.
a++;
int c = a;
// a is now 34, and c is now 34.
现在不需要在更大的表达式中嵌入 ++,因为 b是 32,c是 34,这一点更加清楚。
++ 和并发问题
并发是指系统同时处理多个任务或操作的能力,而不必先执行一个任务再执行另一个任务。不幸的是,++ 运算符在这里可能会导致问题,因为当它被写入字节码时,它会被算作多条 CPU 指令
这个概念可能有点难以理解。这意味着如果两个 CPU 几乎同时调用同一条指令,您可能会丢失一些 ++ 增量命令。这在并发编程中 有时被称为“ ABA 问题”。
为了演示,请考虑在以下情况下访问者计数 (visitorCount) 可能发生的情况:
访客数量 | 线程 A | 线程 B |
三十二 | 增量 (33) | |
33 | 商店 (33) | |
增量 (34) | ||
三十四 | 商店 (34) |
这一切看起来都很好,对吧?但如果两个线程都发生这种情况怎么办?
访客数量 | 线程 A | 线程 B |
三十二 | 增量 (33) | |
| 增量 (33) | |
33 | 商店 (33) | |
| 商店 (33) |
|
在这种情况下,两个线程都会在其中一个线程存储其更新值之前读取访问者计数。这称为丢失更新。
Java中++与并发的解决方案:AtomicInteger
如果您使用的是 Java,它有一个更适合多线程应用程序的功能,称为 AtomicInteger。如果您将代码更改为:
private AtomicInteger visitorCount = new AtomicInteger(0);
// …
public void visitorVisitsWebsite() {
this.visitorCount.increment();
}
...这确保了算术运算和赋值运算不能分开。
结论
++ 在旧式循环、解析器和计数器编码中非常常见。如果您决定使用它,请保持简单。确保为增量提供自己的行和首选项后缀表示法。如果可以,请将其替换为现代对应项,例如增强型 for 循环或 AtomicInteger。
恭喜,您现在了解了 ++ 运算符的全部内容,并且比阅读本文时更加了解。您可以再增加一分知识 — 给自己一个 A++!
请先 登录后发表评论 ~