前缀和后缀运算符有什么区别?

pra*_*eep 33 c prefix-operator postfix-operator

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

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

int fun (int i)
{
    return(i++);
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*nde 54

postfix和前缀版本之间有很大的不同++.

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

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

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

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
Run Code Online (Sandbox Code Playgroud)
  1. i设置为10(简单).
  2. 这一行有两件事:
    • i递增到11.
    • 的值i复制到j.所以j现在等于11.
  3. 这一行还有两件事:
    • i递增到12.
    • 原始的值i(这是11)被复制到k.所以k现在等于11.

所以在运行代码后,i将12但双方jk会11.

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

  • 数字是正确的,但代码没有很好地解释.对于预修复表达式`int j = ++ i;`,变量`i`增加1(`i = i + 1`,所以`i = 11`),然后将其深度复制到`j `(所以`j = 11`).然后对于后修复表达式`int k = i ++;`,变量`i`(仍然是`11`),首先被深度复制到`k`(所以`k = 11`),然后` i`增加1(所以`i = 12`). (11认同)
  • @RenéG除了'i`在前一行已经增加到'11`. (5认同)
  • 我觉得很了不起的是,假设我弄错了数字,人们仍然试图编辑这个答案。所要做的就是运行此代码并打印值以查看我是否正确。 (2认同)

小智 13

字首:

int a=0;

int b=++a;          // b=1,a=1 
Run Code Online (Sandbox Code Playgroud)

在赋值之前,值将增加.

后缀:

int a=0;
int b=a++;  // a=1,b=0 
Run Code Online (Sandbox Code Playgroud)

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


小智 10

之前返回的函数i会递增,因为您使用的是post-fix运算符(++).无论如何,增量i不是全局的 - 只是相应的功能.如果您使用了预修复操作符,则会将其11减少为10.

所以你然后返回i10并在printf函数中递减它,这显示9不像10你想象的那样.


log*_*yth 7

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

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

return i;
i + 1;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

有两个例子说明了差异

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , c++);
Run Code Online (Sandbox Code Playgroud)
  • 这里 c 的值为 0 c 递增 1 然后将值 1 分配给 so 的值a = 1和值c = 1
  • 下一条语句c = 1将 b 的值分配给 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);
Run Code Online (Sandbox Code Playgroud)
  • 这里的printf语句++c将首先将 c 的值增加 1 然后将新值 3 分配给 c 所以printf语句将打印1 1 3