对于c++中的i++与++i的分析

对于c++中的i++与++i的分析


最近看到两篇文章,文章均是针对Java的编译说明,对于c++我测试了一下实际有区别,相关题目我copy过来打算查源码解读一下原因。

  1. 面试官:你说你懂i++跟++i的区别,那你会做下面这道题吗?
  2. 最通俗易懂的i++和++i详解

环境

IDE: MSVC 2017

Hardware: Intel CPU

OS: win10 64bit

题目

示例1

int i = 0;
i = i++; 
System.out.println("i = " + i); 

示例2

int a = 2; 
int b = (3 * a++) + a;
System.out.println(b);

示例3

int a = 2; 
int b = a + (3 * a++);
System.out.println(b);

示例4

int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++; 
System.out.println(k);

示例5

int a = 0;
int b = 0;
a = a++;
b = a++;
System.out.println("a = " + a + ", b = " + b);

代码

TestCase::TestCase()
{
	example1();
	example2();
	example3();
	example4();
	example5();
}


TestCase::~TestCase()
{
}

void TestCase::example1()
{
	std::cout << "example1" << std::endl;
	int i = 0;
	i = i++;
	std::cout << "i = " << i << std::endl;
}

void TestCase::example2()
{
	std::cout << "example2" << std::endl;
	int a = 2;
	int b = (3 * a++) + a;
	std::cout << "a = " << a << ", b = " << b << std::endl;
}

void TestCase::example3()
{
	std::cout << "example3" << std::endl;
	int a = 2;
	int b = a + (3 * a++);
	std::cout << "a = " << a << ", b = " << b << std::endl;
}

void TestCase::example4()
{
	std::cout << "example4" << std::endl;
	int i = 1;
	int j = 1;
	int k = i++ + ++i + ++j + j++;
	std::cout << "i = " << i << ", j = " << j << ", k = " << k << std::endl;
}

void TestCase::example5()
{
	std::cout << "example5" << std::endl;
	int a = 0;
	int b = 0;
	a = a++;
	b = a++;
	std::cout << "a = " << a << ", b = " << b << std::endl;
}

运行结果

在这里插入图片描述

分析

由于上网稍微查了下并没有搜到官方详细的说明,只有下边这份来自微软官网的 例子和简单说明,但是感觉并没有很大价值。1

// 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;
}

It is important to note that a postfix increment or decrement expression evaluates to the value of the expression prior to application of the respective operator. The increment or decrement operation occurs after the operand is evaluated. This issue arises only when the postfix increment or decrement operation occurs in the context of a larger expression.

//上边说的情况我也有点不太懂,有大神明白请给与指教

例子1:

根据这个例子其实可以初步看出实现的顺序,结果是i = 1说明在i = i++时是先处理i = i之后处理i++我们跟着这个思路看下一个例子。

例子2:

int b = (3 * a++) + a;可以通过这个例子看出来a++是括号完成后执行还是整行完成后执行。

结果b = 8说明b = (3 * 2) + 2a = 3说明在执行完b的计算后,进行了a++的操作这时a = 2 + 1

例子3:

这个例子与例子2是相同的,均可以看出来a++是括号完成后执行还是整行完成后执行。

结果b = 8说明b = 2 + (3 * 2)a = 3说明在执行完b的计算后,才进行a++的操作a = 2 +1

例子4:

这个例子就比较有意思了,可以从里边看到很多不同的东西,最终的结果是

// i = 3 j = 3 k = 8

i = 3j = 3比较容易看明白,因为它们都经过了一次++ii++,但是为什么最后的结果是8呢,按照前三个例子得到的结论,k应该是7才对(k = 1 + 2 + 2 + 2)

接下来这句可能会有点绕,重点在于第一个i++操作说明算出k的流程应该是(k = 1 + 3 + 2 + 2)第一个i++是完成的的应为后边执行的++i只有i = 2 + 1才可以得到3。

例子5:

结果是a = 2可以说明两次a++都有执行到,b = 1是将第一次a++的值赋给了它。

总结

待我找到能从底层说明上述现象的原因再补充。


  1. Postfix Increment and Decrement Operators: ++ and – ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章