我看到它们都在大量的c#代码中使用,我想知道什么时候使用i++或++ I (I是一个数字变量,如int, float, double等)。有人知道吗?


当前回答

奇怪的是,看起来其他两个答案并没有说清楚,这绝对值得一说:


i++表示“告诉我I的值,然后递增”

++i表示“增加i,然后告诉我值”


它们是前增量运算符,后增量运算符。在这两种情况下,变量都是递增的,但是如果在完全相同的情况下取两个表达式的值,结果将会不同。

其他回答

奇怪的是,看起来其他两个答案并没有说清楚,这绝对值得一说:


i++表示“告诉我I的值,然后递增”

++i表示“增加i,然后告诉我值”


它们是前增量运算符,后增量运算符。在这两种情况下,变量都是递增的,但是如果在完全相同的情况下取两个表达式的值,结果将会不同。

int i = 0;
Console.WriteLine(i++); // Prints 0. Then value of "i" becomes 1.
Console.WriteLine(--i); // Value of "i" becomes 0. Then prints 0.

这是否回答了你的问题?

只是为了记录,在c++中,如果你可以使用任何一种(即),你不关心操作的顺序(你只想增加或减少,然后再使用它),前缀操作符更有效,因为它不需要创建对象的临时副本。不幸的是,大多数人使用posfix (v++)而不是prefix (++var),因为这是我们最初学到的。(我在一次采访中被问到这个问题)。不确定这在c#中是否正确,但我假设它是正确的。

我想我会用代码来回答这个问题。想象一下int的以下方法:

// The following are equivalent:
//     ++i;
//     PlusPlusInt(ref i);
//
// The argument "value" is passed as a reference,
// meaning we're not incrementing a copy.
static int PlusPlusInt(ref int value)
{
    // Increment the value.
    value = value + 1;

    // Return the incremented value.
    return value;
}

// The following are equivalent:
//     i++;
//     IntPlusPlus(ref i);
//
// The argument "value" is passed as a reference,
// meaning we're not incrementing a copy.
static int IntPlusPlus(ref int value)
{
    // Keep the original value around before incrementing it.
    int temp = value;

    // Increment the value.
    value = value + 1;

    // Return what the value WAS.
    return temp;
}

假设你知道ref是如何工作的,这应该很好地解决了这个问题。在我看来,用英语解释它要笨拙得多。

操作符的工作方式是它同时被加1,但如果它在变量之前,表达式将用加1 /减1的变量求值:

int x = 0;   //x is 0
int y = ++x; //x is 1 and y is 1

如果它在变量之后,则当前语句将与原始变量一起执行,就好像它还没有被加/减:

int x = 0;   //x is 0
int y = x++; //'y = x' is evaluated with x=0, but x is still incremented. So, x is 1, but y is 0

除非必要,我同意dcp使用预递增/递减(++x)。实际上,我唯一一次使用后递增/递减是在while循环或类似的循环中。这些循环是相同的:

while (x < 5)  //evaluates conditional statement
{
    //some code
    ++x;       //increments x
}

or

while (x++ < 5) //evaluates conditional statement with x value before increment, and x is incremented
{
    //some code
}

你也可以在索引数组时这样做:

int i = 0;
int[] MyArray = new int[2];
MyArray[i++] = 1234; //sets array at index 0 to '1234' and i is incremented
MyArray[i] = 5678;   //sets array at index 1 to '5678'
int temp = MyArray[--i]; //temp is 1234 (becasue of pre-decrement);

等等,等等……