| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1773 人关注过本帖, 1 人收藏
标题:关于++a和a++的一些看法
只看楼主 加入收藏
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:2 
程序代码:
#include <stdio.h>
int front_add(int *p)
{
    *p += 1;
    return *p;
}
int tail_add(int *p)
{
    int temp = *p;
    *p += 1;
    return temp;
}
int main (void)
{
    int i = 5;
    printf("%d\n",(front_add(&i))+(front_add(&i))+(front_add(&i)));
    i = 5;
    printf("%d\n",(tail_add(&i))+(tail_add(&i))+(tail_add(&i)));
    int j = 5;
    printf("%d\n",(++j)+(++j)+(++j));
    j = 5;
    printf("%d\n",(j++)+(j++)+(j++));
    return 0;
}

这是++前缀和++后缀运算符的实现方式  虽然结果不一样   但是我觉得前缀和后缀就是调用了那两个函数

                                         
===========深入<----------------->浅出============
2011-10-08 16:41
guilin0822
Rank: 2
来 自:中国
等 级:论坛游民
帖 子:21
专家分:20
注 册:2011-7-28
收藏
得分:2 
在这里我想大家去运算下面几个表达是
    1、(a++)+(++a);
       (++a)+(a++);
以上这两个表达示值相等。
    2、(a++)+(a++)+(++a);
       (a++)+(++a)+(a++);
       (++a)+(a++)+(a++);
这组后面个值相等比第一个式子大2。
    3、(a++)+(a++)+(a++)+(++a);
       (a++)+(a++)+(++a)+(a++);
       (a++)+(++a)+(a++)+(a++);
       (++a)+(a++)+(a++)+(a++);
这组,后两式子值相等。
    4、把a++换成++a,++a换成a++;
    5、把a++换成a计算表达示值不变。

综上所述本人有以下理解,大家讨论:
    一、a++在赋值表达示中和a是完全一样的。
    二、后置++在赋值计算结束后再逐个计算。
    三、++前置和++后置计算时,会把紧跟“=”的两个自加部分合并在一起,并对变量计算前置++,两部分用相同值(前置++后的值)。后面的前置++,逐个自加并同前面的表达式计算;后置++则取前面表达式中所有前置++计算结果。
题外话:
    如果,在程序中,变量a,值是10,程序中要计算这个数学表达示时a+(a+1),可以这么写
int a=10,sum=0;
sum=sum+a+(++a);//此时sum值是21
但一定不能写成
int a=10,sum=0;
sum+=a+(++a);//此时sum值是22,不是21
其实有关前置++的这种误差是与赋值符的自右结合有关,因为所有赋值运算都是自右结合,所以会有前面的误差。



[ 本帖最后由 guilin0822 于 2011-10-8 18:05 编辑 ]
2011-10-08 17:35
ileelsai
Rank: 5Rank: 5
等 级:职业侠客
帖 子:87
专家分:303
注 册:2011-9-25
收藏
得分:0 
回复 9楼 feifei566
ok,不同的理解方式罢了,真正想要知道是怎么回事看一下c的表达式运算代码不就行了
不过我重新研究了下:
另一种理解就是i++的理解应该是执行完整个表达式的其他操作后然后才自增而++i是先自增再参加运算。
a=10;
b=(a++)+(a++)+(a++)=10+10+10=30  a自增3次为13

a=10;
b=(a++)+(a++)+(++a)  表达式到++a时开始1次 b=10+10+11=31 最后a再自增2次
不知你是不是这个什么意思
我不知c语言表达式的求值是怎么运算的,但我自己编的表达式求值代码是用栈操作的

[ 本帖最后由 ileelsai 于 2011-10-8 17:59 编辑 ]
2011-10-08 17:52
ileelsai
Rank: 5Rank: 5
等 级:职业侠客
帖 子:87
专家分:303
注 册:2011-9-25
收藏
得分:0 
回复 12楼 guilin0822
是右结合吗?
int a=10,sum=0;
sum=sum+a+(++a);此时sum值是21       我的理解是入栈 :# sum a   出栈运算sum=10+(++a) 入栈:# 10 ++a
                                    出栈运算sum=10+11  入栈:# 21 #   表示表达式结束出栈  sum=21
                              
但一定不能写成
int a=10,sum=0;                        
sum+=a+(++a);//此时sum值是22,不是21          我的理解是入栈:# a ++a  出栈运算 sum+=11+11
                                               入栈:# 22 sum          出栈运算 sum=22
                                               入栈:# 22 #    表示表达式结束出栈 sum=22
  #是表达式结束符 前后陪对表示表达式运算结束
sum+=a+(++a);可以认为是sum=a+(++a)+sum;   如果是我编c语言的话我会这么编


[ 本帖最后由 ileelsai 于 2011-10-8 18:18 编辑 ]
2011-10-08 18:12
xhl986213688
Rank: 2
等 级:论坛游民
帖 子:27
专家分:32
注 册:2011-9-2
收藏
得分:2 
错误多多,惊喜多多,看来我还的努力学习!!
2011-10-08 20:35
khaz
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:130
专家分:188
注 册:2011-4-21
收藏
得分:2 
研究这些没意义 现实中要避免这样写程序
另外需要知道的是a++只能做右值,++a可以做左值
2011-10-08 23:25
索隆
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2011-8-18
收藏
得分:2 
我怎么觉得编出来的有点怪啊   参数很容易出错啊!!!不是嘛???
可以用更简便的方式啊   可以用别的函数啊
2011-10-08 23:47
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
好了,以上讨论到此结束,我要结贴了
2011-10-10 03:21
scanif
Rank: 1
等 级:新手上路
帖 子:9
专家分:8
注 册:2011-10-10
收藏
得分:0 
不用纠结到底是怎么算出来的答案,记着:
a++:先取a再自加;
++a:先自加再取a。
#include <stdio.h>
如:
void main()
{
    int a=10,b;
    b=(a++)+(++a)+(a++);/*当'+'在第二个a前面的时候算出来是33*/
    printf("%d\n",b);
}
再如:
#include <stdio.h>
void main()
{
    int a=10,b;
    b=(a++)+a+(a++);/*当第二个a的'+'被去掉的时候算出来就是30*/
    printf("%d\n",b);
}
所以说,为了避免一些不必要的错误的时候都不这么写。
2011-10-10 12:35
快速回复:关于++a和a++的一些看法
数据加载中...
 
   



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

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