前缀和后缀运算符有什么区别?

时间:2011-08-11 18:59:00

标签: c postfix-operator prefix-operator

以下代码打印值为9.为什么?此处return(i++)将返回值11,由于--i该值应为10本身,有人可以解释这是如何工作的吗?

#include<stdio.h>
main()
{
    int i= fun(10);
    printf("%d\n",--i);
}

int fun (int i)
{
    return(i++);
}

13 个答案:

答案 0 :(得分:50)

++的后缀版本和前缀版本之间存在差异。

在前缀版本(即++i)中,i的值递增,表达式的值为{{1>}的值}。

在后缀版本(即i)中,i++的值会增加,但表达式的值是i原始值}。

让我们逐行分析以下代码:

i
  1. int i = 10; // (1) int j = ++i; // (2) int k = i++; // (3) 设置为i(简单)。
  2. 这一行有两件事:
    • 10会增加到i
    • 11值已复制到i。因此j现在等于j
  3. 这一行还有两件事:
    • 11会增加到i
    • 12i)的原始值已复制到11。因此k现在等于k
  4. 因此,在运行代码后,11将为12,但ij都将为11。

    同样的东西适用于k的后缀和前缀版本。

答案 1 :(得分:10)

函数在i递增之前返回,因为您使用的是修复后操作符(++)。无论如何,i的增量不是全局的 - 只是对各自的功能。如果您使用了预修复操作符,则它将为11,然后递减为10

然后你将i作为10返回并在printf函数中递减它,它会按你的想法显示9而不是10

答案 2 :(得分:10)

<强>前缀:

int a=0;

int b=++a;          // b=1,a=1 
在分配之前

将增加值。

<强>后缀:

int a=0;
int b=a++;  // a=1,b=0 

首先分配&#39; a&#39;到&#39;&#39;然后增加&#39; a&#39;

的值

答案 3 :(得分:7)

实际上return (i++)只会返回10。

++和 - 运算符可以放在变量之前或之后,具有不同的效果。如果它们在之前,则它们将被处理并返回并且基本上被处理为(i-1)或(i + 1),但是如果你放置++或 - 在i之后,那么返回是非常的

return i;
i + 1;

所以它会返回10并且永远不会增加它。

答案 4 :(得分:4)

后缀增量++在评估之前不会增加其操作数的值。 i++的值为i

前缀递减在评估之前增加其操作数的值。 --i的值为i - 1

前缀递增/递减会在计算表达式之前更改该值。后缀增量/减量改变后的值。

因此,在您的情况下,fun(10)返回10,打印--i打印i - 1,即9。

答案 5 :(得分:3)

i ++是后期增量。增量发生在返回值之后。

答案 6 :(得分:3)

有两个例子说明差异

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , c++);
  • 这里c的值0 c递增1,然后将值1赋值给so值 a = 1c = 1
  • 的值
  • 下一个语句assiagn c = 1到b的值然后将c增加1 值b = 1和值c = 2

  • printf语句中我们c++这意味着c的原始值 这将打印2然后将c增加1,因此printf语句 将打印1 1 2,现在c的值为3

您可以使用http://pythontutor.com/c.html

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
  • 这里printf语句++c会先将c的值增加1 将新值3分配给c,因此printf语句将打印1 1 3

答案 7 :(得分:2)

它与后增量运算符的工作方式有关。它返回i的值,然后递增该值。

答案 8 :(得分:2)

首先,请注意名为i的函数参数和i中名为main()的变量是两个不同的变量。我认为这对当前的讨论并不重要,但重要的是要知道。

其次,您在fun()中使用postincrement运算符。这意味着表达式的结果是在 i递增之前的值;简单地丢弃i的最终值11,并且函数返回10.作为不同变量的main中的变量i被赋值为10,然后递减到9。

答案 9 :(得分:2)

Actually what happens is when you use postfix i.e. i++, the initial value of i is used for returning rather than the incremented one. After this the value of i is increased by 1. And this happens with any statement that uses i++, i.e. first initial value of i is used in the expression and then it is incremented.

And the exact opposite happens in prefix. If you would have returned ++i, then the incremented value i.e. 11 is returned, which is because adding 1 is performed first and then it is returned.

答案 10 :(得分:2)

<强>解释

第1步: int fun(int);这里我们声明函数fun()的原型。

第2步: int i = fun(10);变量i被声明为整数类型,fun(10)的结果将存储在变量i中。< / p>

第3步: int fun(int i){ return (i++); }fun()内,我们返回值return(i++)。它返回10。因为i++是职责后的运营商。

第4步:然后将控件返回到main函数,并将值10分配给变量i

第5步: printf("%d\n", --i);此处--i表示开业前。因此它打印值9

答案 11 :(得分:1)

fun(10)返回10.如果你想让它返回11那么你需要使用++ i而不是i ++。

int fun(int i)
{
    return ++i;
}

答案 12 :(得分:1)

让我们保持尽可能简单。

let i = 1
console.log('A', i)    // 1
console.log('B', ++i)  // 2
console.log('C', i++)  // 3
console.log('D', i)    // 4

A)打印i的值 B)首先我增加,然后用i作为新值运行console.log C)Console.log在i的当前值下运行,然后我会增加 D)打印i

的值

简而言之,如果您使用前置速记,即(++ i),我将在执行该行之前得到更新。如果您使用后记速记即(i ++),则当前行将运行,好像我尚未更新一样,然后我会增加,因此下次您的解释器出现时,它将增加。