50

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

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

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

13 回答 13

83

. 的后缀版本和前缀版本之间存在很大差异++

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

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

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

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i设置为10(简单)。
  2. 这条线上有两件事:
    • i递增到11
    • i被复制到j. 所以j现在等于11
  3. 这条线上还有两件事:
    • i递增到12
    • (即)的原始值被复制到. 所以现在等于。i11kk11

所以在运行代码后,将i是 12,但两者都是 11。jk

相同的东西适用于 . 的后缀和前缀版本--

于 2011-08-11T19:05:40.973 回答
15

字首:

int a=0;

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

在赋值之前, 的值将增加。

后缀:

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

首先将'a'的值分配给'b'然后增加'a'的值

于 2014-10-29T09:18:37.260 回答
10

i由于您使用的是后缀运算符 (++),因此之前返回的函数会递增。无论如何,增量i不是全局的 - 仅针对相应的功能。如果您使用了前缀运算符,它将是11然后递减为10.

因此,您然后返回i10 并在 printf 函数中将其递减,这与您想象的9不同。10

于 2011-08-11T19:01:13.837 回答
7

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

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

return i;
i + 1;

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

于 2011-08-11T19:02:36.730 回答
5

有两个例子说明了区别

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
  • 下一条语句将 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);
  • 这里 inprintf语句++c将首先将 c 的值增加 1 然后将新值 3 分配给 c 所以printf语句将打印1 1 3
于 2017-04-23T13:45:27.383 回答
4

后缀增量++在计算完成之前不会增加其操作数的值。的i++值为i

前缀减量会在计算之前增加其操作数的值。的--i值为i - 1

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

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

于 2011-08-11T19:01:28.897 回答
4

让我们尽可能简单。

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++) 当前行将运行,就好像我还没有被更新然后我得到增加,所以下次你的解释器遇到我时它会增加。

于 2020-06-29T22:18:56.783 回答
3

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

于 2011-08-11T19:01:41.527 回答
3

首先,注意函数参数namedi和变量named是两个不同的i变量main()。我认为这对目前的讨论没有那么重要,但重要的是要知道。

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

于 2011-08-11T19:02:04.630 回答
3

解释:

第一步: 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

于 2016-02-07T15:22:59.700 回答
2

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

于 2011-08-11T19:01:32.150 回答
2

实际上,当您使用后缀即 i++ 时会发生什么,i 的初始值用于返回而不是递增的值。在此之后,i 的值增加 1。这发生在任何使用 i++ 的语句中,即 i 的第一个初始值在表达式中使用,然后它增加。

前缀正好相反。如果您会返回 ++i,则返回递增的值,即 11,这是因为先执行加 1,然后再返回。

于 2015-12-14T18:09:04.080 回答
1

fun(10) 返回 10。如果您希望它返回 11,那么您需要使用 ++i 而不是 i++。

int fun(int i)
{
    return ++i;
}
于 2011-08-11T19:01:51.877 回答