刚才有一个有趣的想法。在C#和Java等语言中,我知道在增量和减量方面,你可以做一个帖子,或者预先增加/减少。像这样:
int a = 5;
Console.WriteLine(a++); // Would print out 5,
// And then increment a to 6
Console.WriteLine(++a); // Would then print out 7 because
// it increments a before printing it out
但是,我想知道是否有任何人可能做这样的事情:
int a = 5;
Console.WriteLine(a += 5); // Would print out 5,
// And then increment a to 10
Console.WriteLine(a =+ 5); // (Or something along those lines)
// To print out 15 at this point
只是感兴趣并且并不知道在哪里或如何寻找答案,所以想知道SO上是否有人会对此有所了解。谢谢!
修改:在评论中添加了我的问题
确切地定义了a += 5
和a =+
5的位置?我从来没有见过第二个使用过的。它是否存在......?他们编译成同样的东西吗?
答案 0 :(得分:4)
在过去,C语言提供了这种语法作为从变量中添加或减去值的快捷方式。
a =+ 5;
b =- 5;
但是在C的生命早期,dmr(祝福的记忆)和ken弃用了这种语言,而不是
a += 5;
b -= 5;
正好同样的目的,因为它很容易编写b=-5
,这意味着与b -= 5
完全不同的东西。这经验丰富的"程序员记得重写一堆代码以匹配新的语言规范。
因此,a++
或--b
中的构造中从未出现过前或后增量语义。
答案 1 :(得分:1)
我所知道的任何语言都没有这样的操作符,但你可以编写自己的C#函数来做同样的事情!
static void postAdd<T>(ref T lhs, T rhs) {
T saved = lhs;
lhs += rhs;
return saved;
}
这在Java中是不可能的,因为Java不支持使用ref
传递引用。
答案 2 :(得分:1)
Console.WriteLine(a+=5);
在语言中完全合法。它是一种预增量运算符,因为它会在将值返回到a
调用之前递增变量WriteLine
。
= +不是有效的运算符,因为它不是由C#标准定义的。可以在此页面上找到所有C#运算符:https://msdn.microsoft.com/en-us/library/ewkkxkwb.aspx
无法创建自己的运算符,因为编译器必须知道如何创建表达式树或解析该行以生成IL。除此之外,通过大量的工作,尤其是Rosyln的发布,理论上你可以创建自己的语言(如IronPython),并拥有这些操作符。
您最接近自己的运营商的是扩展方法,例如:
public class Extensions
{
public static int AddMul(this int x, int add, int mull)
{
return x * mull + add;
}
}
将使用如下:
int x = 4;
int y = x.AddMul(2, 3); //y now equals 14
答案 3 :(得分:0)
以下打印所需的结果,但不是很漂亮的代码:
int a = 5;
System.out.println(a+=5);
System.out.println((a+=5)-5);
System.out.println(a);
打印:
增量后,10,10,15
a+=5
返回a
的值。 (a+=5)-5
递增a
并在递增之前返回其值。
a=+5
只需编译为a=5
。这将执行分配和unary plus operator。它类似于a=-5
(a
等于负5)。
System.out.println(+5);
打印:
5
在C#
中,等效代码生成相同的输出:
int a = 5;
Console.WriteLine(a+=5);
Console.WriteLine((a+=5)-5);
Console.WriteLine(a);
Console.WriteLine(+5);
打印:
10,10,15,5
答案 4 :(得分:0)
没有。 a += 5
不是后期增量。这是一个增量。
a++
是后增量。并且++a
是预增量。