C++的++和--运算

++是C++的自增运算符,作用是使变量自加1;--是自减运算符,作用是使变量自减1。++和--有两种用法,一种是前缀用法,一种是后缀用法。前缀用法如:++i、--i ,后缀用法如i++、i--,前缀用法跟后缀用法的差别在于前缀时++i的值为完成i加1后的值,--i为完成i减1后的值。例如:假设i的初值为3,执行cout<<++i<<endl;输出结果为4,而执行cout<<i++<<endl;输出结果为3。--运算符同理。这是世人皆知的常识,我们不再讨论,现在我们来讨论一点有趣的东西,看如下代码:

#include <iostream>
using namespace std;

int main()
{
int i=3;
cout<<(i++)+(i++)+(i++)<<endl;
cout<<i<<endl;
return 0;
}

问,第一次和第二次输出的结果分别是多少?

有人说,是12和6。理由是,表达式从左至右开始计算,因为第一个括号内++运算符是后缀用法,i的初值为3,所以,第一个括号的值是3,计算完第一个括号之后,i自加1,变成4,然后计算第二个括号,第二个括号里的++也是后缀用法,所以,值为4,执行完第二个括号后,i再加1,变成5,接下计算第三个括号,第三个括号里的++也是后缀用法,所以,第三个括号的值为5,然后计算第三个括号相加的和,即3+4+5=12。这个理由看起来不错,似乎应当是这样。然而,运行结果却让人大跌眼镜,竟然是9和6。这是怎么回事呢?说起来也很简单,这是因为很多编译系统规定,在遇到一条计算表达式中同时出现若干i++、i--的情况时,在当前语句中并不执行i的自增和自减,i的初值是多少,i++和i--的值就是多少,当这条表达式执行完成之后,再将i连续自加或自减若干次。

再看如下代码:

#include <iostream>
using namespace std;

int main()
{
int i=3;
cout<<(++i)+(++i)+(++i)<<endl;
cout<<i<<endl;
return 0;
}

问,第一次和第二次输出的结果分别是多少?

有人说,结果应该是4+5+6=15和6。理由我想大家都想明白,我就不多说了。还有人总结了上例的经验,认为,输出结果应该是9和6。我们来运行一下这个程序,看看谁说得对……

好了,运行结果出来了,不过这不是什么好结果,可能很多人看完会抓狂,结果尽然是神鬼莫测的18和6。为什么呢?道理跟上例差不多,那就是很编译系统规定,连续多个前缀式++和--运算符出现在同一个运算表达式中时,先将变量连续自加或自减N次,然后判定++i的值为i+N。

为了验证上面的说法,请看下面的代码:

#include <iostream>
using namespace std;

int main()
{
int i=3;
cout<<(++i)+(i++)+(++i)<<endl;
cout<<i<<endl;
return 0;
}

时间: 2024-10-28 07:44:16

C++的++和--运算的相关文章

Verilog有符号数运算

在数字电路中,出于应用的需要,我们可以使用无符号数,即包括0及整数的集合:也可以使用有符号数,即包括0和正负数的集合.在更加复杂的系统中,也许这两种类型的数,我们都会用到. 有符号数通常以2的补码形式来表示.图1列出了4位二进制表示法所对应正负数.进一步观察,我们发现两种类型数的加减法是一样的,做加法和减法就是 在数轮上按正时钟转转或按反时钟转.比方说,1001+0100,意味着从1001按照顺时钟方向移动4个位置,其结果为1101.在无符号数类型中,它 代表(+9)+(+4)=+13:而在有符

C# And 逻辑“与”运算示例

  C# And 逻辑"与"运算示例,声明两个整形变量和一个bool类型的变量,然后进行相应的逻辑"与"运算,并输出结果,初学C#的逻辑判断时要了解的内容: view sourceprint?01using System; 02using System.Collections.Generic; 03using System.Linq; 04using System.Text; 05namespace LogicAnd 06{ 07 class Program 08

C#实现数组元素的交集和并集运算

编写一个类实现数组元素的交集和并集运算 要求:       1.要有构造函数对数组初始化       2.包含交集和并集两个单独的方法       3.要有一个打印数组元素的方法       4.编写一个测试类测试数组       5.要求控制台中要分别输出两个原数组以及将交集和并集运算结果输出 代码: using System;  using System.Collections.Generic;  using System.Text;  namespace ConsoleApplicatio

集算器协助java处理结构化文本的集合运算

JAVA不直接支持集合运算,因此要用嵌套循环才能实现文本文件之间的交集.并集.差集 等集合运算,如果文件数量较多,或者文件较大而无法放入内存直接计算,再或者要按照多个字段进行集合运算,则相应的代码会更加复杂.集算器直接支持集合运 算,可以协助JAVA轻松实现此类算法,下面我们通过例子来看一下具体作法. 有两个小文件:f1.txt和f2.txt,第一行是列名,现在需要对文件中的Name字段进行交集运算.部分数据如下: 文件f1.txt: 文件f2.txt: 集算器代码: A1.B1:用import

c语言-我写的是两个数的加减运算,以字符串数组形式保存

问题描述 我写的是两个数的加减运算,以字符串数组形式保存 #include #include void main(void) { char str1[30]={0}; char str2[30]={0}; char str3[30]={0}; printf("Please input the first number:"); gets(str1); printf("Please input the second number:"); gets(str3); add(

Excel工作表中使用模拟运算表的方法

  Excel工作表中使用模拟运算表的方法          1.创建一个新的Excel工作表,并在工作表输入数据.在B9单元格中输入提成金额的计算公式"=$B$2*$B$3",如图1所示. 图1 创建工作表并输入公式 2.在B10:B23单元格区域中输入提成比率,然后选择用于创建模拟运算表的单元格B9:I23,在"数据"选项卡的"数据工具"组中单击"模拟分析"按钮,在打开的下拉列表中选择"模拟运算表"选项

寄存器位运算的与或问题

问题描述 寄存器位运算的与或问题 #define GPIO_BASE (0x7F008000)#define rGPACON (*(volatile unsigned *)(GPIO_BASE+0x00))rGPACON = (rGPACON & ~(0xff<<0)) | (0x22<<0); 对這个有点小蒙:1.~(0xff<<0) = ?2.GPIO_BASE+0x00 0x7F008000 + 0x00是32位的:0111 1110 0000 0000

数组中求乘积-JAVA中二维数组的函数运算

问题描述 JAVA中二维数组的函数运算 for(i=0;i<MAX;i++){ for(j=0;j<MAX;j++){ d[i][j]=0; for(k=0;k<MAX;k++) d[i][j]+=a[i][k]*b[k][j]; } } 就是在这个程序中为什么最后的乘积是 for(k=0;k<MAX;k++) d[i][j]+=a[i][k]*b[k][j];

[经典面试题]位运算操作

[LeetCode]136.Single Numbe [LeetCode]201.Bitwise AND of Numbers Range [剑指Offer]40.数组中只出现一次的数字 一道位运算的算法题

link中类似C++的流运算是怎么实现的?能不能实现字符串输出流?

问题描述 link中类似C++的流运算是怎么实现的?能不能实现字符串输出流? link中类似C++的流运算是怎么实现的?能不能实现字符串输出流? 解决方案 http://kb.cnblogs.com/page/42581/