返回信息流交换两个局部变量的值
Go:
package main
import "fmt"
func swap(a *int, b *int) {
tmp := *a
*a = *b
*b = tmp
}
func main() {
x := 1
y := 2
if x < y {
swap(&x, &y)
}
fmt.Printf("x=%d, y=%d\n", x, y) // x=2, y=1
}
以前用过C/C++/Go的Java程序员:
public class Main {
public static void swap(int[] a, int[] b) {
int tmp = a[0];
a[0] = b[0];
b[0] = tmp;
}
public static void main(String[] args) {
// 因为不能得到“指向局部变量的指针/引用”,只能拿数组当容器凑合一下了。
int[] a = {1};
int[] b = {2};
if (a[0] < b[0]) {
swap(a, b);
}
System.out.printf("a=%d, b=%d", a, b); // a=2, b=1
}
}
Python来乱入一下:
a = 1
b = 2
if a < b:
a,b = b,a
print("a={}, b={}".format(a, b)) # a=2, b=1
正经的Java程序员:
public class Main {
public static void main(String[] args) {
int a=1, b=2;
int a2=a, b2=b;
if (a < b) {
a2=b; b2=a; // 也许会担心这一段的效率,但其实编译器很聪明的。这段代码简直就是为优化器而写的,优化器很容易看出模式。
}
// 从此以后开始使用a2和b2,不再使用a和b
System.out.printf("a=%d, b=%d", a2, b2); // a=2, b=1
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #40224同步于 2015/4/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
Go可以做但Java很难做到的事
nuanyangyang
2015/4/27镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 FatGhosta 的大作中提到: 】
: 暖神,你别欺负没有学过GO的小朋友好么?
: swap方法完全没必要吧?跟python一样,GO也是可以a,b=b,a的.
重点是通过指针来在外部修改局部变量的值。是一种特性,但难说是好事还是坏事。很容易被滥用的一个功能。
这个不应该称为引用传递么?C也有这个概念啊?
【 在 nuanyangyang 的大作中提到: 】
:
: 重点是通过指针来在外部修改局部变量的值。是一种特性,但难说是好事还是坏事。很容易被滥用的一个功能。
class Program
{
static void Main(string[] args)
{
int a = 1, b = 2;
Swap(ref a, ref b);
Console.WriteLine(a);
Console.WriteLine(b);
Console.Read();
}
private static void Swap(ref int a, ref int b)
{
int c = a;
a = b;
b = c;
}
}
虽然知道会被吐槽,但是c井狗表示不服。[ema34]
【 在 nuanyangyang 的大作中提到: 】
: 交换两个局部变量的值
: Go:
: [code=c]
: ...................
【 在 FatGhosta 的大作中提到: 】
: 这个不应该称为引用传递么?C也有这个概念啊?
:
C没有按引用传递。C里传的是值,这个值是指向一个存储空间的指针,这个存储空间碰巧是一个局部变量的。
Java里局部变量没有“存储空间”,所以也就不能“指向”了。Java也没有仅指向对象的一个域的引用。
【 在 aiquestion 的大作中提到: 】
: [code=csharp]
: class Program
: {
: ...................
为什么呢?C#是可以这样写的,因为C#有“assignable expression”的概念。类似C/C++里面的l-value,也是可以赋值的。
如果使用unsafe,是可以取得局部变量的地址的。