| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1221 人关注过本帖
标题:求教++i与i++
只看楼主 加入收藏
gtrmao
Rank: 2
等 级:论坛游民
帖 子:38
专家分:32
注 册:2011-10-24
收藏
得分:2 
每个编译器编译顺序不同的
2011-11-15 10:50
fuyucao
Rank: 1
等 级:新手上路
帖 子:67
专家分:7
注 册:2011-10-17
收藏
得分:2 
晕了
2011-11-15 12:30
罗镭
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-10-31
收藏
得分:2 
你照书上的啊
2011-11-15 17:44
雾非雾
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-2-11
收藏
得分:2 
以下是引用我菜119在2011-11-14 21:56:08的发言:

你那个最后的i怎么还能输出个13,求解释啊?????呵呵!再怎么整,那也不应该是13,难道不是4吗?你用的是什么编译器?呵呵!


原来printf是由右向左,我还在那郁闷为什么第一个i是9呢,学习了
2011-11-16 17:06
cheenbee
Rank: 2
等 级:论坛游民
帖 子:53
专家分:32
注 册:2011-11-3
收藏
得分:2 
回复 10楼 我菜119
可不可以说的准确些,压栈什么的我们现在都还听不懂,请教它们的结合步骤,以Visual C++为例,行不行
2011-11-16 17:19
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
VC++是自右向左计算的,因此最右边++i得4,右数第二个式子(++i)+(i++)+(i++)从(++i)计算得5(此时i也是5),而右边的两个(i++)都是5所以为15,再向左(++i)+(++i)+(i++),(++i)两次,所以为7(i也就是7了),故3上7为21,乘下的(++i)+ (i++)+(++i),分别为8+8+9这个好理解(此时i=8),最左边一个当然就是9啦

这里的计算似乎并不规范,它可能有编译器优化影响.(特别是结果为15和21的两项计算),所以解释有点...


[ 本帖最后由 cnfarer 于 2011-11-16 20:10 编辑 ]

★★★★★为人民服务★★★★★
2011-11-16 20:08
bianchenyang
Rank: 2
等 级:论坛游民
帖 子:21
专家分:26
注 册:2011-11-14
收藏
得分:2 
不要研究这样的问题!
2011-11-16 20:13
cheenbee
Rank: 2
等 级:论坛游民
帖 子:53
专家分:32
注 册:2011-11-3
收藏
得分:0 
#include<stdio.h>
int main(){
    int i=3;
    /*int b=(i++)+(i++)+(i++);
    printf("i=%d\nb=%d\n",i,b);//三个i值相加后然后i再自增三次输出i的值为6*/
    int b=(++i)+(++i)+(++i);
    printf("i=%d\nb=%d\n",i,b);//i先自增1,再参与运算,由于i自增1三次后值为6,三个6相加为b的值
   
    return 0;
}
    LZ  共勉之!
2011-11-16 20:21
cheenbee
Rank: 2
等 级:论坛游民
帖 子:53
专家分:32
注 册:2011-11-3
收藏
得分:0 
以下是引用cheenbee在2011-11-16 20:21:17的发言:

#include
int main(){
    int i=3;
    /*int b=(i++)+(i++)+(i++);
    printf("i=%d\nb=%d\n",i,b);//三个i值相加后然后i再自增三次输出i的值为6*/
    int b=(++i)+(++i)+(++i);
    printf("i=%d\nb=%d\n",i,b);//i先自增1,再参与运算,由于i自增1三次后值为6,三个6相加为b的值
   
    return 0;
}
    LZ  共勉之!
当然这也是与系统编译器有关,我写的这是多数的情况!
2011-11-16 20:22
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:2 
以下是引用我菜119在2011-11-14 21:56:08的发言:

你那个最后的i怎么还能输出个13,求解释啊?????呵呵!再怎么整,那也不应该是13,难道不是4吗?你用的是什么编译器?呵呵!


i最后输出13,很正常啊。c语言函数默认采用__cdecl调用约定是没错,但这个只是一个框架,只是针对于 栈的布局来讲才有意义。 通常栈是向低地址生长,foo(a,b,c)这样的函数用常规思维思考的话,一般把a b c的地址依次增加,因此就有 c先入栈 然后是b 再是a 的假象. __cdecl只是保证a b c的地址依次增加,而不是入栈顺序是按c b a.其实完全也可以按b a c或 a b c.

在谷歌上输入关键字 "C语言 序列点 副作用" 就会明白
printf ("%d %d", i, ++i)是未定义的行为,
printf ("%d %d", ++i, j)是符合标准C的语句。
2011-11-16 20:45
快速回复:求教++i与i++
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012712 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved