详解C++中的增量运算符++和减量运算符--的用法_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++
运算符
增量运算符、位运算符的用法、c语言运算符详解、java运算符详解、三目运算符的用法,以便于您获取更多的相关知识。

时间: 2024-08-30 10:01:00

详解C++中的增量运算符++和减量运算符--的用法_C 语言的相关文章

详解C++中的指针、数组指针与函数指针_C 语言

C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力.指针可以用于数组.或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较严重的问题. 1.指针 程序中所有的变量和常量都存在一个内存地址中,当然,函数也有对应的内存地址,内存地址的不同会导致程序执行时有所不同. 指针就是用来控制和存储内存地址的变量,它指向单个对象的地址,除了void之外,指针的数据类型与所指向地址的变量数据类型保持一致. 2.如何定义指针.

详解C语言中freopen()函数和fclose()函数的用法_C 语言

C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include <stdio.h> 定义函数: FILE * freopen(const char * path, const char * mode, FILE * stream); 函数说明: 参数 path 字符串包含欲打开的文件路径及文件名. 参数mode 请参考fopen()说明.. 参数stream 为已打开的文件指针. Freopen()会将原stream 所打开的文件流关闭, 然后打开参数path 的文件.

详解C++中对构造函数和赋值运算符的复制和移动操作_C 语言

复制构造函数和复制赋值运算符从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值. 在本文中,"赋值"意味着复制赋值,除非有其他显式声明. 赋值操作和初始化操作都会导致对象被复制. 赋值:在将一个对象的值赋给另一个对象时,第一个对象将复制到第二个对象中. 因此, Point a, b; ... a = b; 导致 b 的值被复制到 a 中. 初始化:在以下情况下将进行初始化:声明新对象.参数通过值传递给函数或值通过值从函数返回. 您可以为类类型的对象定义"复

详解C++成员函数的override和final说明符的用法_C 语言

override 说明符 可使用 override 关键字来指定在基类中重写虚函数的成员函数. 语法 function-declaration override; 备注 override 仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义:否则,它不是保留的关键字. 使用 override 有助于防止您的代码中出现意外的继承行为.以下示例演示在未使用 override 的情况下,可能不打算使用派生类的成员函数行为.编译器不会发出此代码的任何错误. class BaseClass { vir

详解C语言中telldir()函数和seekdir()函数的用法_C 语言

C语言telldir()函数:取得目录流的读取位置头文件: #include <dirent.h> 定义函数: off_t telldir(DIR *dir); 函数说明:telldir()返回参数dir 目录流目前的读取位置. 此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置, 有错误发生时返回-1. 错误代码:EBADF 参数dir 为无效的目录流. 范例 #include <sys/types.h> #include <dirent.h> #includ

详解C++中二进制求补运算符与下标运算符的用法_C 语言

二进制求补运算符:~  语法 ~ cast-expression 备注 二进制反码运算符 (~)(有时称为"按位反码"运算符)将生成其操作数的按位二进制反码.即,操作数中为 1 的每个位在结果中为 0.相反,操作数中为 0 的每个位在结果中为 1.二进制反码运算符的操作数必须为整型. ~ 的运算符关键字 compl 运算符是 ~ 的文本等效项.访问程序中的 compl 运算符有两种方式:包括头文件 iso646.h,或使用 /Za 进行编译. // expre_One_Compleme

详解Android中用于线程处理的AsyncTask类的用法及源码_Android

为什么要用AsyncTask我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程中执行,不会占用主线程的时间片,所以主线程会及时响应用户的操作,如果使用new Thread来执行任务,那么如果需要中

详解C#中的定时器Timer类及其垃圾回收机制_C#教程

关于C# Timer类  在C#里关于定时器类就有3个 C# Timer使用的方法1.定义在System.Windows.Forms里 C# Timer使用的方法2.定义在System.Threading.Timer类里  " C# Timer使用的方法3.定义在System.Timers.Timer类里 下面我们来具体看看这3种C# Timer用法的解释: (1)System.Windows.Forms.Timer 应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或D

详解Android中ViewPager的PagerTabStrip子控件的用法_Android

我们先来看一个小例子: 可以看到,效果实现的也是很棒,比之前自定义的标签指示器更加的流畅.下面,简单介绍一下 PagerTabStrip和它的使用. PagerTabStrip是v4支持包里面的类,是ViewPager专用的类,不能在其他地方使用.在使用的时候,我们只需要在ViewPager的布局里面声明即可.     如下面的代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns