下面的代码打印出一个值 9。为什么?这里return(i++)
将返回一个 11 的值,由于--i
该值本身应该是 10,任何人都可以解释它是如何工作的吗?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
下面的代码打印出一个值 9。为什么?这里return(i++)
将返回一个 11 的值,由于--i
该值本身应该是 10,任何人都可以解释它是如何工作的吗?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--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
(简单)。i
递增到11
。i
被复制到j
. 所以j
现在等于11
。i
递增到12
。i
11
k
k
11
所以在运行代码后,将i
是 12,但两者都是 11。j
k
相同的东西适用于 . 的后缀和前缀版本--
。
字首:
int a=0;
int b=++a; // b=1,a=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++);
a = 1
和值c = 1
下一条语句将 b 的值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
后缀增量++
在计算完成之前不会增加其操作数的值。的i++
值为i
。
前缀减量会在计算之前增加其操作数的值。的--i
值为i - 1
。
前缀递增/递减在计算表达式之前更改值。后缀递增/递减改变后的值。
因此,在您的情况下,fun(10)
返回 10,并打印--i
prints i - 1
,即 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 的值。
简而言之,如果您使用预速记 ie(++i) 我将在执行该行之前得到更新。如果您使用后速记 ie(i++) 当前行将运行,就好像我还没有被更新然后我得到增加,所以下次你的解释器遇到我时它会增加。
i++ 是后增量。返回值后发生增量。
首先,注意函数参数namedi
和变量named是两个不同的i
变量main()
。我认为这对目前的讨论没有那么重要,但重要的是要知道。
其次,您在fun()
. 这意味着表达式的结果是增加之前 i
的值;最终值 11i
被简单地丢弃,函数返回 10。i
返回 main 中的变量是一个不同的变量,被赋值为 10,然后您将其递减以得到 9。
解释:
第一步: int fun(int);
这里我们声明函数的原型fun()
。
步骤 2: int i = fun(10);
变量 i 被声明为整数类型,结果fun(10)
将存储在变量 中i
。
第 3 步: int fun(int i){ return (i++); }
在内部fun()
我们返回一个 value return(i++)
。它返回10
。因为i++
是后自增运算符。
第4步:然后控制回到主函数并将值10
分配给变量i
。
第5步: printf("%d\n", --i);
这里--i
表示预增量。因此它打印 value 9
。
它与后增量运算符的工作方式有关。它返回 i 的值,然后递增该值。
实际上,当您使用后缀即 i++ 时会发生什么,i 的初始值用于返回而不是递增的值。在此之后,i 的值增加 1。这发生在任何使用 i++ 的语句中,即 i 的第一个初始值在表达式中使用,然后它增加。
前缀正好相反。如果您会返回 ++i,则返回递增的值,即 11,这是因为先执行加 1,然后再返回。
fun(10) 返回 10。如果您希望它返回 11,那么您需要使用 ++i 而不是 i++。
int fun(int i)
{
return ++i;
}