【程序设计】i++与++i的底层汇编分析

在一些面试题中,很多面试官会故意出一些很刁钻的题来考面试者。当面对这种问题时,不要慌,第一个出口的答案必须是,虽然这些看起来技巧性很高的代码对我们理解语言与编译器的本质很有用途,但是实际开发过程中应该尽量避免高技巧性的写法,尽量做到通俗易懂,下面以我个人的见解对这道题的分析是:

譬如下面这些题:

1、请问:

#include <IOSTREAM>
using namespace  std;
int main()
{
	int i = 10;
	i = (i++) + (i++) + (++i);
	cout << i <<endl;
	return 0;
}

输出的i的结果会是多少?

答案是:

好,下面我们来进行简单的分析(如果你实在看不懂下边的汇编源码,万不得已可以记住这个定律)

无论如何i++总是在一条语句中直接取i进行运算,等语句执行完再执行自加;就譬如j=i++一样可以拆成j=i和i=i+1;

我们总是会把i代入给j等到语句结束后后面再执行i=i+1;

而在一道表达式里++i总是在任何一个执行到他的语句的前一时刻执行,我们讲得生动点就是,你先在这稍等一下,让我++i执行完了再来告诉你继续执行

好了,有了上面2个分析点,我们来分析一下i = (i++) + (i++) + (++i);

此时是这样的情况  “ i = i + i ...你得稍等一下我++i执行完再来告诉你 "
此时执行i=i+1,执行完此时i就是11;但是由于之前i已经是10了,所以等号右边前2个i是10,第3个i是11;所以i = 10 + 10 + 11 = 31 ,有同学就说,咦,不对啊,答案是33,哈哈,其实你是忘了我们的i++,要等这个赋值语句执行完了,再执行2次自加,而此时i已经是31了,自加2次自然就是33了。

有兴趣的朋友可以用上面的方法研究一下i =
 (++i)+(i++) + (i++) ;

今晚实在太困了,明天再剖析i++与++i的汇编源码。

本文由Cout_Sev 撰写。

若有错误欢迎指正

转载请注明出处:http://blog.csdn.net/cout_sev/

谢谢合作!

在一道表达式里++i总是在任何一个执行到他的语句的前一时刻执行,

时间: 2024-10-12 12:10:28

【程序设计】i++与++i的底层汇编分析的相关文章

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

RACSignal 冷信号和热信号底层实现分析

前言 由于最近在写关于RACSignal底层实现分析的文章,当然也逃不了关于冷热信号操作的分析.这篇文章打算分析分析如何从冷信号转成热信号的底层实现. 目录 1.关于冷信号和热信号的概念 2.RACSignal热信号 3.RACSignal冷信号 4.冷信号是如何转换成热信号的 一. 关于冷信号和热信号的概念 冷热信号的概念是源自于源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable, Hot Observable是主动的

高级C代码的汇编分析

在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要负责清除堆栈 所以这种调用常会生成较大的可执行文件. _stdcall又称为WINAPI调用方式,规则: 1,参数从右向左入堆栈 2,被调用的函数在返回前自行清理堆栈 所以这种调用会生成比cdecl小的代码 Pascal调用方式,主要用在WIN16函数库中,现在基本不用 规则: 1,参数从左向右入堆

HashMap底层原理分析(put、get方法)

1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那hash值就是相同的.当hash值相同时,就会出现hash冲突,HashMap通过链表来解决冲突. 原理图: 实例: import java.util.HashMap; import java.util.Map; ? public class HashMapTest { public static vo

PHP排序函数sort底层实现分析

线性表(即线性数据结构,如数组和链表)的常规排序算法,包括冒泡.插入.选择.归并和快排,其中综合性能最好的就是快排(快速排序),所以快排在工程实践中也有大量的应用,比如很多编程语言都提供了排序函数,而这些排序函数基本都是基于快速排序实现的,比如 PHP 的数组排序函数 sort 就是如此. 今天我们将以此函数的底层实现为例,为大家展示如何基于快速排序来实现 PHP 的 sort 函数(准确的说,是综合运用了插入排序和快速排序). PHP 数组排序函数 sort 底层实现分析 首先我们来给大家介绍

VC++代码的汇编分析(一)

VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念和技术的真正含义,对程序优化和编码都有非常实用的重要价值.由于内容很多,我会分解为很多篇章进行解读实例. 从main入口开始分析,使用古老的VC6.0编译器编译,先从最简单的例子开始逐步扩展,便于大家逐步入门. VC++源代码: int main(int argc, char* argv[]) {p

JMM和Volatile底层原理分析

JMM和volatile分析 1.JMM:Java Memory Model,java线程内存模型 JMM:它是一个抽象的概念,描述的是线程和内存间的通信,java线程内存模型和CPU缓存模型类似,它是标准化的,用于屏蔽硬件和操作系统对内存访问的差异性. 2.JMM和8大原子操作结合 3.volatile的应用及底层原理探究 volatile : 轻量级的synchronized,在多处理器的开发中保证了共享变量的"可见性".可见性的意思:当一个线程修改了某个共享变量时,其他使用到该共

使用汇编分析c代码的内存分布

arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完成之后的elf文件,进行反汇编. 之后重定向到tmp.s文件中. 第一步变量如下c文件. vim tmp.c #include<stdio.h> #define VAR 0xFF int a = 0; static int b = 0; int c = 10; static int d = 20; const int finalone = 10; const int final; int main