后置运算符:i++表示在使用x之后,再使x的值加1,即i=i+1;
前置运算符:++i表示在使用x之前,先使x的值加1,即i=i+1.
前缀运算和后缀运算的区别:前缀运算是“先变后用”,而后缀运算是“先用后变”
这样看结果是一样的,还是没有区别,原因在于,x两次都是对自身使用了x,但实际当有其他变量、一个表达式内有其他运算时,情况就可能不太一样了。(以下详说)
一般实际使用时,在如此的单个i变量的for循环里使用两种自加都没有区别:
以上的举例都是i++和++i使用的结果相同的例子,可以看出:i都是自己使用自己,所以看不出二者有什么差别。
后置运算符:i++表示在使用x之后,再使x的值加1,即i=i+1;
前置运算符:++i表示在使用x之前,先使x的值加1,即i=i+1.
也就是说,他们一个是先用再+1,一个是先+1再用
这就像一盘菜的两个原料一样。“花生油炒西红柿”
如果不炒,只是将花生油和西红柿掺起来,那么,无论是先把西红柿放在碗里再放花生油还是先把花生油放到锅里再放西红柿,结果都是一样的:生西红柿泡在了生花生油里。
但是,如果再使用一个锅来炒它们。那么,先放西红柿还是先放花生油就会产生不一样的菜的味道。
在代码中,这个“锅”是什么呢?是a。
a=i++是先将i=1的值赋值给a,然后i=i+1,最后a的结果是1
a=++i是先i=i+1,此时,i=2,然后把i的值赋值给a,最后a是2
i--和--i与i++和++i是类似的情况,可参照前文进行理解
++与- -是连体操作符:?如果分开写,则成两个独立的+或-了,所以中间不能有空格。如果有多于两个的+或-连写,则编译器按”贪吃法则“理解。所谓贪吃,是指只要能理解能成为操作符,就尽量多读入字符。
在C和C++语言中,++
?和?--
?操作符被称为自增和自减操作符。这些操作符在语法上是不可以分割的,也就是说,它们是"连体"的,中间不能有空格。
例如,如果你尝试写下这样的代码:
int x = 5;
int y = ++ 5; // 错误!不能这样写
编译器会报错,因为?++
?和数字?5
?被视为两个独立的符号,而不是一个合法的自增操作。
另外,您提到的"贪吃法则"也确实适用于C/C++语言。这是一种编译器在解析表达式时采取的策略,如果多个相同的运算符连在一起(比如两个或更多的?+
?或?-
),编译器会尝试尽可能多地将其解析为一个操作符。例如:
int z = + + - - 7; // 实际上是 (int) (+ (+ (-7))),结果为-7
在这个例子中,尽管有三个?+
?和两个?-
,但编译器将它们解析为两个?+
?和两个?-
,而不是四个独立的符号。这是因为?+ + - -
?在语法上是合法的,表示先对一个负数进行两次自增操作(使其变为正数),然后再进行两次自减操作(使其变为负数)。
对于连续的四五个?+
?或?-
,C/C++ 编译器仍然会尽量将它们解析为一个操作符。让我们来看几个例子:
连续的?+
:
int a = + + + 5; // (int) (+ (+ (+ 5))),结果为5
这里,三个?+
?被解析为一个自增操作符,所以?+ + + 5
?等同于?5++
,最终结果是?5
。
2.?连续的?-
:
int b = -- -- 5; // (int) ((5--), (5--)),结果为-5
这里,两个?-
?被解析为自减操作符,所以?-- -- 5
?等同于?5--
?和?5--
,最终结果是?-5
。
3.?混合的?+
?和?-
:
int c = + - - + 7; // (int) ((+ (-7)), (+ (+7))),结果为
这里,两个?+
?和两个?-
?被解析为两个操作符:一个自增和一个自减。所以?+ - - + 7
?等同于?(+ (-7))
?和?(+ (+7))
,最终结果是?7
。
所以,即使连续有四五个?+
?或?-
,编译器还是会尽可能地将它们解析为一个整体的操作符。这是由于C/C++语言的设计选择,以便更直观地表达复杂的操作。
?