printf中连续输出i++,--i,++i,i--的值如何
来源:互联网 发布:数据来源有哪些 编辑:程序博客网 时间:2024/05/17 08:50
首先看一下代码:
#include <stdio.h>
void main()
{
int i=10;
printf("%d %d %d %d %d\n",i--,--i,++i,i++,i);
}
开始我的预测答案是:11 11 12 10 10
运行后:11 10 10 10 10
开始我认为是printf的问题就用函数进行了输出,代码如下:
#include <stdio.h>
void fun(int a,int b,int c,int d,int f)
{
printf("%d %d %d %d %d\n",a,b,c,d,f);
}
void main()
{
int i=10;
fun(i--,--i,++i,i++,i);
}
然而结果还是11 10 10 10 10
所以就对前一段代码进行了反汇编,看一下汇编是如何处理这个的:
运算过程:
00B13C25 mov eax,dword ptr [i] 从i中取出值放入eax寄存器中
00B13C28 mov dword ptr [ebp-0D0h],eax 将寄存器的值保存在临时量中
00B13C2E mov ecx,dword ptr [i] 取出i的值,加一后写回i
00B13C31 add ecx,1
00B13C34 mov dword ptr [i],ecx
00B13C37 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C3A add edx,1
00B13C3D mov dword ptr [i],edx
00B13C40 mov eax,dword ptr [i] 取出i的值,加一后写回i
00B13C43 sub eax,1
00B13C46 mov dword ptr [i],eax
00B13C49 mov ecx,dword ptr [i] 取出i的值,保存在临时量中
00B13C4C mov dword ptr [ebp-0D4h],ecx
00B13C52 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C55 sub edx,1
00B13C58 mov dword ptr [i],edx
输出过程:
00B13C5D mov eax,dword ptr [i] 从I中取出值放入寄存器中后入栈
00B13C60 push eax
00B13C61 mov ecx,dword ptr [ebp-0D0h] 从保存后置++的ebp-0D0h中取出值放入寄存器后入栈
00B13C67 push ecx
00B13C68 mov edx,dword ptr [i] ++i
00B13C6B push edx
00B13C6C mov eax,dword ptr [i] --i
00B13C6F push eax
00B13C70 mov ecx,dword ptr [ebp-0D4h] i--
00B13C76 push ecx
从上面的汇编可以看出:编译器在处理前置,和后置时是不一样的。
在处理后置时:是将值放入临时量中,在输出时直接从临时量中取值
在处理前置时:是等运算完成后,直接从I的地址中取值
所以才会出现上面那种与我们以前的想法不同的值。
- printf中连续输出i++,--i,++i,i--的值如何
- gcc 编译器中 printf i++ 和 ++i 的输出
- ++i、i++、printf函数
- printf("%d,%d,%d,%d\n",i++,--i,++i,i++);编译器是如何处理的。
- ++i 和 i++的输出
- 关于c++中printf 和 i++,++i的问题
- c++中printf("%5d%5d%5d%5d%5d", ++i, --i, i++, --i, -i--)的问题
- C++的printf(),以及++i, i++
- printf下的“i++”和“i--”
- I
- I
- ++i
- I
- I
- i
- ++i
- i++
- (++i) + (++i) + (++i) + (++i)
- 给定一个字符串,找到最先出现的相同字符
- 【zqsz&&loi 互测 11.6】 T1
- DOM型XSS学习笔记
- python多线程(转)
- Python-列表解析和生成表达式
- printf中连续输出i++,--i,++i,i--的值如何
- java杨枝作业11.4/11.5
- 电路实践
- C++基础系列:指针移动后delete问题
- 【日更】矩阵方面的各种习题?
- Linux系统之存储管理
- 关于ftp你知道这几点就够了
- [LeetCode]343. Integer Break
- DBA_ADVISOR_LOG