printf函数()和i++,++i函数问题

关于 i++和++i在编程中的问题。_百度知道
关于 i++和++i在编程中的问题。
(1)void main(){i=3;printf(&%d %d\n&,i,i++);} 输出结果是 3 3 void main(){i=3;printf(&%d %d\n&,i,++i);}输出结果是 4 4
为什么啊 (2)循环中 for(i=0;i&=n;i++)和for(i=0;i&=n;++i)有什么区别?
我有更好的答案
第一个程序中输出结果应该是
3;printf(&%d %d\n&,i,i++);
输出语句是从右往左执行的。i++ 之后i就变为4;i++ 是先引用在自增; 所以是 4
3;printf(&%d %d\n&,i,++i);
中 ++i 中i先自增在使用,子增后变为4; 所以是4
4;循环中 for(i=0;i&=n;i++)和for(i=0;i&=n;++i)没什么太大区别,不过后一个运行时节省空间
(1)我也认为应该是 4 3 但是我运行输出是 3 3 这也是我问的原因。(2)请问为什么后一个节省空间?谢谢了!
运行时先储存i,然后再进行自增运算,而++i 直接得到自增后的结果我是用的dev c++。那个结果就是4
我用的visual C++ 6.0 确实输出 3 3.原来真的是编译器的问题?不过我相信你确实输出了 4 3。你的意思是++i并不存储i,而是直接做i+1 所以节省了空间对吧?
采纳率:43%
++i 是先对 i求++运算,然后使用i的值。而i++正好相反。函数的参数是从右往左算的i++与++i单独用没区别的,所以第二个没区别
(1),i++和++i分别是使用i之前加1和使用i之后加1,也就是说、还是举个例吧:int i=1 ,则i++=1,而++i=2;
了解不??printf(&%d %d\n&,i,i++);在编译器中是从右到左计算的(2).i++和++i在for循环中并无差异都相当于i=i+1;望采纳~~!!!
(1)你说的都对 但是C语言书上认为从右到左计算输出结果是 4 3.我也是这么认为的。可是我运行程序后运行结果是3 3.难道说我编译器有问题?您的答案也很好 但是我觉得2楼回答的更合我的心意!所以这次不能采纳您的回答了。见谅!谢谢您!
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。printf函数一般格式为(格式控制,输出列表),但为什么会有prints(%d,i++)?_百度知道
printf函数一般格式为(格式控制,输出列表),但为什么会有prints(%d,i++)?
我有更好的答案
是printf(&%d&,i++);么?
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 237791
博文数量: 72
博客积分: 2485
博客等级: 大尉
技术积分: 715
注册时间:
分类: C/C++ 17:28:26
首先,我们选择的平台是Vc6.0,如果使用vs2005就没必要讨论这个问题了。
例1 、#includevoid main(){int i=0;printf("%d %d %d",++i,++i,++i);}输出为3 2 1
原因是,如果一个函数有多个参数,比如int fun (int a, int b, int c);调用时,总是从最后一个参数开始压栈。 也就是c先进栈,其次是b,最后才是a。因此
先计算最后一个参数(即最右一个++i),压入1,以此类推,再压入2,3和字符串"%d,%d,%d"的首地址。所以 , 程序的输出是 3,2,1
#includevoid main(){int i=0;printf("%d %d %d",i++,i++,i++);}的输出?我用VC结果是0 0 0,而不是是2 1 0
#include #include #define F(x) (x+x+x)main(){
int i=2;&printf("%d\t%d",i,F((i++)));&
printf("\t%d\n",i);}
答案:2&&&&&&& 6&&&&&&&& 5
解释:其中f((i++))表示的是i++ + i++ + i++ 因为先求i相加,再i++,因此答案比较好解释,然而下面一题:
#include #include #define F(x) (x+x+x)main(){
int i=2;&printf("%d\t%d",i,F((++i)));&
printf("\t%d\n",i);}
答案:5&&&&&&&&13&&&&&&&& 5
解释:其中f((i++))表示的是++i + ++i + ++i,因为c是从右向左计算机,就表示成了{++i + (++i + ++i)},首先计算机小括号内,最后一个++i表示此时i的值为3,中间再以3为基值,++i 的值就为4,由于i是变量,小括号为表示此时i的值相加4+4为8,再与前面一个++i相加,即5+8=13
注:只是函数,printf从右向左,等式是从左向右,别搞混淆了!
注:此文具有代表性,仔细一下,能让人豁然开朗。
阅读(1817) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~
Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com
请登录后评论。教你解决++i和i++困惑
我的图书馆
教你解决++i和i++困惑
教你解决++i和i++困惑重新复习c语言,看到函数这张,有个小问题,如下几个程序:& 程序一:& main()& {& int&a=0;& printf("a=%d\n",a++);& }& /*结果a=0;*/& 程序二:& main()& {& int&a=0;& printf("a=%d\n",++a);& }& /*结果a=1;*/& 程序三:& main()& {& int&a=0;& a++;&&/*&或者++a&*/& printf("a=%d\n",++a);& }& /*结果a=2;*/& 程序四:& main()& {& int&a=0;& a++;&&/*&或者++a&*/& printf("a=%d\n",a++);& }& /*结果a=1;*/& 程序五:& main()& {& int&a=0;& a++;&&/*&或者++a&*/& printf("a=%d\n",a);& }& /*结果a=1;*/& 在这几个程序里面我觉得(尤其是第五个)应该a++和++a出来的结果是0,1呀!!怎么全是一呢?& 请assiss等大哥,稍作讲解!& 我这边慢慢调试找找感觉,谢了~~& a++是先用后加,& ++a是先加后用。& 比如& int&a=0;& printf("%d",++a);先加,a=1,再用,打印出1& 而& int&a=0;& printf("%d",a++);先用,打印出0,然后再加,a=1.& 但是,这仅仅是++出现在同一个语句的时候才有的问题,& 当a++或++a单独成为一个语句时,没有任何区别。& 比如:& int&a=0;& a++;//先用a,没什么用,再加,a=1& 再如:& int&a=0;& ++a;//先加,a=1,再用,依然没什么用。&&教你解决++i和i++困惑
喜欢该文的人也喜欢对i++,i--,++i,--i深刻认识以及printf()函数打印的过程
先来看一个例子:
int main()
int i = 0;
printf("%d,%d,%d\n", i++, --i, i++);
有一部分人认为打印的结果应该是0,0,0.
下面是VS2013运行出来的结果:
大家心里肯定会有疑惑,为什么会是这样的结果?我们不妨先来分析一下。
大家都很清楚,printf()这个函数在打印参数内容时,是从右往左的,当有多个参数时(依次入栈的原因),printf()函数执行时是遍历一个参数打印一个参数呢?还是先遍历一遍参数然后在依次打印呢?大家有没有考虑过呢?
我们不妨假设printf()函数执行时遍历一个参数打印一个参数:
1、首先处理的是最右边的表达式i++,打印出其结果为0,而后i的值变为1;
2、接下来处理的是表达式–i,由于i的值已变为1,所以打印的结果为0,而后i的值变为0;
3、最后处理的是最左边的表达式i++,此时i值为0,所以打印的结果为0,而后i的值变为1。
通过上面的分析,可以看出打印的结果是0,0,0,可真的是这样吗?
我们先来看一下上述代码的汇编代码:
1、在红色框里,处理表达式i++时,先通过寄存器eax先将内存中i的值(为0)放入一个系统临时开辟的整型大小的地址空间(ptr [ebp-0D0h]开始的地址空间)中保存起来,之后通过寄存器ecx将内存中i的值加1再将加1后的结果放到i原来的内存中去,此时内存中i的值变为1;
2、红色框里的指令是用来处理表达式–i的,可以看出在处理表达式–i时,是直接通过寄存器edx将内存中i的值减1之后再将减1后的结果放到i原来的内存中去,此时i的值变为0.;
3、接下来处理最左边的表达式i++,可以看出红色框内的代码和处理最最右边的表达式i++的代码几乎一样,只是存放i值的地址不一样,这次是通过寄存器eax将i的值0存放到内存dword ptr [ebp-0D4h]开始的内存单元中。
接下来便是入栈了:
第一步是通过寄存器edx将内存ptr [ebp-0D0h]开始的连续四个地址空间的值入栈,该值为0;
第二步是将内存中i的值通过寄存器eax入栈,此时i的值为1;
第三步通过通过寄存器edx将内存ptr [ebp-0D4h]开始的连续四个地址空间的值入栈,该值为0。
之后系统将当前指令的下一条指令的地址入栈(现场保护),然后调用printf()函数依次打印上述表达式的结果,得到的结果是0,1,0
通过上面的分析,相信大家对i++,i–,++i,–i以及printf()函数打印的过程已经深刻理解了。
最后,总结一下:
对于前置++、–处理的时候系统会直接操作不产生临时量,只需三条代码;对于后置++、–处理的时候会先产生一个临时量,而后通过临时量返回结果,需要五条代码,所以在同样的环境下前置++或–要比后置++或–效率要高。
对于printf()函数的处理过程,我们可以看到,是先将参数从右到左遍历一遍,最后才执行打印操作,而不是遍历一个打印一个。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 单片机printf函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信