| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1385 人关注过本帖
标题:关于++运算符的问题
只看楼主 加入收藏
hewenhao
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-1-10
收藏
 问题点数:0 回复次数:17 
关于++运算符的问题
int add(int a,int b)
{
    return (a+b);
}

int a=5;

add(a++,a) =10
add(a,a++) =11
add(++a,a) =12
add(a,++a) =12
add(++a,++a) =14
add(++a,a++) =12
add(a++,a++) =11
add(a++,++a) =13

为什么add(++a,++a) =14,而add(a++,++a) =13呢,现在弄糊涂了,哪位大侠给解释一下吧,万分感谢!
搜索更多相关主题的帖子: 运算符 
2008-06-22 10:52
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
add(++a,++a) =14
add(++a,a++) =12
add(a++,a++) =11
add(a++,++a) =13
这四个,没意义。

add(a++,a) =10
add(a,a++) =11
add(++a,a) =12
add(a,++a) =12
这四个,我只能告诉你,cdecl调用约定,参数是自右向左入栈的,不过这个不是语言的内容,也并不被保证。

总结:此问题毫无意义,如果是个人好奇想了解,可以在学习汇编以后看编译器生成的汇编代码。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-22 11:02
netsolo
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2008-3-6
收藏
得分:0 
.file    "noname1.c"
    .text
.globl _add
    .def    _add;    .scl    2;    .type    32;    .endef
_add:
    pushl    %ebp
    movl    %esp, %ebp
    movl    12(%ebp), %eax
    addl    8(%ebp), %eax
    popl    %ebp
    ret
    .def    ___main;    .scl    2;    .type    32;    .endef
.globl _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    andl    $-16, %esp
    movl    $0, %eax
    addl    $15, %eax
    addl    $15, %eax
    shrl    $4, %eax
    sall    $4, %eax
    movl    %eax, -8(%ebp)
    movl    -8(%ebp), %eax
    call    __alloca
    call    ___main
    movl    $5, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    call    _add
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _add
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _add
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _add
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _add
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    _add
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    call    _add
    leal    -4(%ebp), %eax
    incl    (%eax)
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    leal    -4(%ebp), %eax
    incl    (%eax)
    call    _add
    movl    $0, %eax
    leave
    ret
2008-06-22 11:13
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
很好,又见GCC
上次给某个人解释汇编,结果连个谢谢都不说
这次不上当了,你自己看吧

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-22 11:19
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
麻烦能不能发优化过的代码- -这种代码很难看的好不好- -

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-22 11:20
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
又一个未定义行为.. - -

樱花大战,  有爱.
2008-06-22 11:24
hewenhao
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-1-10
收藏
得分:0 
看一下add(++a,a) =12
a(5)先进栈,然后++a(6)再进栈,函数的参数是值拷贝的,也就是说参数6和5被传入函数,函数在堆栈中创建临时变量存放这两个值。所以我认为返回值应该是11啊,为什么编译器返回的是12呢?

请教starwing83!

2008-06-22 11:25
hewenhao
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-1-10
收藏
得分:0 
回复 4# StarWing83 的帖子
感谢starwing83,呵呵

2008-06-22 11:26
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
= =下次不说了……
其实前自加应该在函数调用前完成,至于什么时候完成,标准没有规定,所以上面的行为未定义啦,你非要追究的话,其实是这样的:
++a;
add(a,a);
所以是12.

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-06-22 11:34
hewenhao
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-1-10
收藏
得分:0 
差不多明白了,谢谢啊。后自加就没有这个问题了

2008-06-22 11:45
快速回复:关于++运算符的问题
数据加载中...
 
   



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

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