后缀自增和前缀自增的概念是什么?

79

我不理解后缀和前缀的自增或自减概念。有没有人能给出更好的解释呢?


2
可能是What is the difference between ++i and i++的重复问题。 - TylerH
或许是在C++中递增-何时使用x++或++x?(或者,很可能还有其他10个问题)。 - underscore_d
如果你懂印地语 :), 这个视频非常清晰地解释了 https://www.youtube.com/watch?v=yRt-zYFJIvE - Deepak
14个回答

0

来自C99标准(C++应该相同,除了奇怪的重载)

6.5.2.4 后缀递增和递减运算符
限制条件
1. 后缀递增或递减运算符的操作数必须具有限定或未限定的实数或指针类型并且必须是可修改的左值。
语义
2. 后缀 ++ 运算符的结果是操作数的值。在获得结果之后,操作数的值会增加。 (即,将适当类型的值1加到其中)。请参阅添加运算符和复合赋值的讨论以获取有关约束条件、类型和转换以及操作对指针的影响的信息。更新操作数的存储值的副作用应出现在前一个和下一个序列点之间。
3. 后缀--运算符类似于后缀++运算符,只是操作数的值会递减(即从其中减去适当类型的值1)。
6.5.3.1 前缀递增和递减运算符
限制条件
1.前缀递增或递减运算符的操作数必须具有限定或未限定的实数或指针类型并且必须是可修改的左值。
语义
2.前缀++运算符的操作数值会增加。结果是增量后的操作数的新值。表达式++E相当于(E + = 1)。请参阅加性运算符和复合赋值的讨论,以获取有关约束条件、类型、副作用和转换以及操作对指针的影响的信息。
3.前缀--运算符类似于前缀++运算符,只是操作数的值会递减。

11
不附加任何评论或解释地发布ISO标准的大块文本并不真正有帮助,特别是当该文本并非完全自包含时(从该文本中,什么是序列点?什么是lvalue?如何使此lvalue合格或无资格?“加法运算符和复合赋值”的讨论在哪里?)。此外,假设C++与其他语言相同通常是一个坏主意。即使是像运算符行为这样的看似简单的事情,在两种语言之间也存在许多小而重要的差异。 - James McNellis
2
很抱歉,用不同语言发布标准的部分并没有什么帮助。大多数情况下,C++中的增量运算符是用于类类型的,这会让事情变得更加混乱而不是有帮助。 - daramarak
OP没有提到C ++。我在学习C时发现了这个答案。赞(因为这对我来说是正确的答案)。 - m4r35n357

-1
#include<stdio.h>
void main(){
char arr[] ="abcd";
char *p=arr,*q=arr;
char k,temp;
temp = *p++; /* here first it assigns value present in address which
is hold by p and then p points to next address.*/
k = ++*q;/*here increments the value present in address which is 
hold by q and assigns to k and also stores the incremented value in the same 
address location. that why *q will get 'h'.*/
printf("k is %c\n",k); //output: k is h
printf("temp is %c\n",temp);//output: temp is g
printf("*p is %c\n",*p);//output: *p is e
printf("*q is %c",*q);//output: *q is h
}

指针的后增量与前增量


-4

预增量是在增加值++之前,例如:

(++v) or 1 + v

后置递增是在增加值++之后,例如:

(rmv++) or rmv + 1

程序:

int rmv = 10, vivek = 10;
cout << "rmv++ = " << rmv++ << endl; // the value is 10
cout << "++vivek = " << ++vivek; // the value is 11

首先,值的增量是前增量,下一步的增量为后增量。 - R.M.VIVEK ARNI

-6

你还应该知道,在C/C++和Java中,后增量/减量运算符的行为是不同的。

鉴于

  int a=1;

在C/C++中,表达式为:
 a++ + a++ + a++

在JavaScript中,它的值为3,而在Java中它的值为6。猜猜为什么...

这个例子更加令人困惑:

cout << a++ + a++ + a++ << "<->" << a++ + a++ ;

打印出 9<->2 !! 这是因为上述表达式等同于:

operator<<( 
  operator<<( 
    operator<<( cout, a++ + a++ ), 
    "<->"
  ), 
  a++ + a++ + a++ 
)

1
这可能是由于C99标准的规定:“更新操作数存储值的副作用应该发生在前一个和下一个序列点之间。” - Pedro J. Ponce de León
我用C和C++编译器尝试了这个。它的结果也是6。你用什么编译器得到了3? - Foo Bar
5
如果在一个表达式中两次使用前/后置自增运算符,这就是未定义行为 - Galik
2
语句“在C/C++中,表达式a++ + a++ + a++的计算结果为3”是错误的。正如@Galik所指出的那样,它会导致未定义的行为。 - Happy Green Kid Naps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接