c -前缀和后缀操作符的区别是什么?



下面的代码打印一个值9。为什么?这里return(i++)将返回值11,由于--i的值应该是10本身,有人能解释这是如何工作的吗?

#include<stdio.h>
main()
{
    int i= fun(10);
    printf("%dn",--i);
}
int fun (int i)
{
    return(i++);
}

++后缀与前缀版本差异较大

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

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

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

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i设置为10 (easy)
  2. 这一行有两件事:
    • i递增到11
    • i值复制到j中。所以j现在等于11
  3. 这一行还有两件事:
    • i递增到12
    • i值(即11)复制到k中。所以k现在等于11

运行代码后,i将是12,但jk都将是11。

对于--的后缀和前缀版本同样适用

前缀:

int a=0;
int b=++a;          // b=1,a=1 
的值在赋值前将被加1。

后缀:

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

首先将'a'的值赋给'b',然后增加'a'的值

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

因此,您然后返回i作为10,并在printf函数中减少它,这显示9而不是您认为的10

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

++和——操作符可以放在变量的前面或后面,效果不同。如果它们在之前,那么它们将被处理和返回,并且基本上就像(i-1)或(i+1)一样处理,但是如果您将++或——放在i之后,那么返回基本上是

return i;
i + 1;

所以它将返回10并且不增加它。

有两个例子说明了差异

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

  • printf语句中,我们有c++,这意味着c的原始值这是2将打印然后增加1 c所以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给c赋新值3,这样printf语句将打印1 1 3

后置自增++直到计算完成后才增加其操作数的值。

i++的值为i

前缀减量在被求值之前增加其操作数的值。

--i的值为i - 1

前缀自增/自减在表达式求值之前改变值。后缀自增/自减改变后面的值

因此,在您的示例中,fun(10)返回10,并且打印--i打印i - 1,这是9。

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

首先,注意函数参数imain()中的变量i是两个不同的变量。我认为这与目前的讨论无关,但知道这一点很重要。

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

解释:

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

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

step3: int fun(int i){ return (i++); }fun()里面我们返回一个值return(i++)。它返回10。因为i++是后加运算符。

步骤4:然后将控制返回到主函数,并将值10赋值给变量i

step5: printf("%dn", --i);这里--i表示预增量。因此,它打印的值是9

让我们尽量保持简单。

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

A)打印i的值

B)首先i被增加,然后console.log使用i作为新值运行。

C) Console.log运行时i为当前值,然后i将被增加。

D)打印i的值。

简而言之,如果你使用预简写,即(++i),我将在行执行之前得到更新。如果你使用后速记,即(i++),当前行将运行,好像我还没有更新,然后我增加,所以下次你的解释器遇到i时,它将增加。

这与自增后操作符的工作方式有关。它返回i的值,然后增加该值。

实际上,当您使用后缀(即i++)时,会使用i的初始值而不是增量值进行返回。在此之后,i的值增加1。这在任何使用i++的语句中都会发生,即在表达式中使用i的第一个初始值,然后对其进行递增。

在prefix中正好相反。如果您要返回++i,那么将返回增加后的值,即11,这是因为先执行加1,然后再返回1。

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

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

相关内容