详解C++中的增量运算符++和减量运算符--的用法

 更新时间:2016年01月12日 15:31:51   投稿:goldensun  
这篇文章主要介绍了C++中的增量运算符++和减量运算符--的用法,分为前缀情况和后缀情况来讲,需要的朋友可以参考下

前缀增量和减量运算符:++ 和 --
 
语法

++ unary-expression –– unary-expression

备注
前缀递增运算符 (++) 向其操作数添加 1;此递增值是表达式的结果。操作数必须是类型不为 const 的左值。结果是与操作数相同类型的左值。
前缀递减运算符 (––) 与前缀递增运算符类似,只不过操作数将减少 1,并且结果是递减值。
前缀和后缀递增和递减运算符均会影响其操作数。它们之间的主要差异是递增或递减在表达式的计算中出现的顺序。在前缀形式中,将在表达式计算中使用值之前进行递增或递减,因此表达式的值与操作数的值不同。在后缀形式中,将在表达式计算中使用值之后进行递增或递减,因此表达式的值与操作数的值相同。例如,以下程序将打印“++i = 6”:

// expre_Increment_and_Decrement_Operators.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;

int main() {
  int i = 5;
  cout << "++i = " << ++i << endl;
}

整型或浮动类型的操作数将按整数值 1 递增或递减。结果的类型与操作数类型相同。指针类型的操作数将按其所寻址对象的大小递增或递减。递增的指针将指向下一个对象;递减的指针将指向上一个对象。
由于增量和减量运算符具有副作用,因此在预处理器宏中使用带递增或递减运算符的表达式时会产生意外的结果。请看以下示例:

// expre_Increment_and_Decrement_Operators2.cpp
#define max(a,b) ((a)<(b))?(b):(a)

int main()
{
  int i = 0, j = 0, k;
  k = max( ++i, j );
}

宏将扩展为:

k = ((++i)<(j))?(j):(++i);

如果 i 大于或等于 j 或者比 j 小 1,则将递增两次。
System_CAPS_note注意
由于 C++ 内联函数会消除副作用(如此处描述的副作用),并允许语言执行更全面的类型检查,因此在很多情况下 C++ 内联函数较宏更为可取。

后缀增量和减量运算符:++ 和 --
 
语法

      postfix-expression
      ++
postfix-expression ––
备注
C++ 提供了前缀和后缀递增和递减运算符;两者的区别在于,在后缀表示法中,运算符出现在 postfix-expression 之后,而在前缀表示法中,运算符出现在 expression 之前。以下示例显示了一个后缀递增运算符:
i++;
应用后缀递增运算符 (++) 的效果是操作数的值增加一个适当类型的单位。同样,应用后缀递减运算符 (––) 的效果是操作数的值减少一个适当类型的单元。
值得注意的是,后缀递增或递减表达式的计算结果为应用各自的运算符之前的表达式的值。递增或递减运算在计算操作数之后发生。仅当在较大的表达式的上下文中发生后缀递增或递减运算时才会出现此问题。
当后缀运算符应用于函数参数时,在参数的值传递给函数之前,不能保证该值是递增还是递减。
将后缀递增运算符应用于指向 long 类型的对象数组的指针实际上会将指针的内部表示形式增加 4。此行为会导致以前引用数组的第 n 个元素的指针引用第 (n+1) 个元素。
后缀递增运算符和后缀递减运算符的操作数必须是算术或指针类型的可修改的(非 const)左值。结果的类型与 postfix-expression 的类型相同,但不再是左值。
后缀递增运算符的操作数也可以是 bool 类型,在这种情况下,将计算操作数,然后将其设置为 true)。后缀递减运算符的操作数不能是 bool 类型。
以下代码演示了后缀递增运算符:

// expre_Postfix_Increment_and_Decrement_Operators.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main() {
  int i = 10;
  cout << i++ << endl;
  cout << i << endl;
}

不支持对枚举类型执行后递增和后递减操作:

enum Compass { North, South, East, West );
Compass myCompass;
for( myCompass = North; myCompass != West; myCompass++ ) // Error

相关文章

  • C++中vector迭代器失效问题详解

    C++中vector迭代器失效问题详解

    vector是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器,这篇文章主要给大家介绍了关于C++中vector迭代器失效问题的相关资料,需要的朋友可以参考下
    2021-11-11
  • c语言生成随机uuid编码示例

    c语言生成随机uuid编码示例

    这篇文章主要介绍了c语言生成随机uuid编码示例,需要的朋友可以参考下
    2014-05-05
  • 利用C语言编写“剪刀石头布”小游戏

    利用C语言编写“剪刀石头布”小游戏

    这篇文章主要给大家介绍了关于如何利用C语言编写“剪刀石头布”小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 通过示例详解C++智能指针

    通过示例详解C++智能指针

    这篇文章主要为大家通过示例介绍了C++智能指针的使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • C++输入输出操作符重载的深入分析

    C++输入输出操作符重载的深入分析

    本篇文章是对C++输入输出操作符重载进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一篇文章带你了解C++中的异常

    一篇文章带你了解C++中的异常

    这篇文章主要为大家详细介绍了C++中的异常,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • QT+OpenCV实现录屏功能

    QT+OpenCV实现录屏功能

    这篇文章主要为大家详细介绍了QT+OpenCV实现录屏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言学习进阶篇之万字详解指针与qsort函数

    C语言学习进阶篇之万字详解指针与qsort函数

    之前的指针详解中,提到过qsort函数,这个函数是用来排序的,下面这篇文章主要给大家介绍了关于C语言指针与qsort函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C++的静态类型检查详解

    C++的静态类型检查详解

    这篇文章主要为大家详细介绍了C++的静态类型检查,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C/C++ Socket设置接收超时时间的多种方法

    C/C++ Socket设置接收超时时间的多种方法

    网络编程中经常需要处理的一个问题就是如何正确地处理Socket超时,对于C/C++,有几种常用的技术可以用来设置Socket接收超时时间,在这篇文章中,我们将详细介绍如何在C/C++中设置Socket的非阻塞模式以及如何配置接收超时时间,需要的朋友可以参考下
    2024-01-01

最新评论