以下代码打印值为9.为什么?此处return(i++)
将返回值11,由于--i
该值应为10本身,有人可以解释这是如何工作的吗?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
答案 0 :(得分:50)
++
的后缀版本和前缀版本之间存在大差异。
在前缀版本(即++i
)中,i
的值递增,表达式的值为{{1>}的新值}。
在后缀版本(即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
将为12,但i
和j
都将为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++);
a = 1
和c = 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 ++),则当前行将运行,好像我尚未更新一样,然后我会增加,因此下次您的解释器出现时,它将增加。