下面的代码打印一个值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)
-
i
设置为10
(easy) - 这一行有两件事:
-
i
递增到11
。 - 将
i
的新值复制到j
中。所以j
现在等于11
。
-
- 这一行还有两件事:
-
i
递增到12
。 - 将
i
的原值(即11
)复制到k
中。所以k
现在等于11
。
-
运行代码后,i
将是12,但j
和k
都将是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++是后增量。该增量发生在返回值之后。
首先,注意函数参数i
和main()
中的变量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;
}