| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 614 人关注过本帖
标题:调用函数
只看楼主 加入收藏
panrui0512
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2014-1-11
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
调用函数
调用函数 fun2(i=i/2);与fun2(i/2);有什么不一样呢:如下
#include<stdio.h>
int fun2(int);
int main()
{
    int i=5;
    fun2(i/2);
    printf("i=%d\n",i);
    fun2(i=i/2);
    printf("i=%d\n",i);
    return 0;}
int fun2(int i)
{
    i=i<=2?5:0;
    return (i);}
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: return 
2014-01-11 22:02
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:2 
举个栗子
源代码
程序代码:
#include<stdio.h>

int fun(int);

int main(int argc, char** argv)
{
    int i=2, r;
    r = fun(i=i+3);
    printf("i=%d,r=%d\n", i, r);
    return 0;
}


int fun(int a)
{
    return a;
}

汇编指令
程序代码:
    .section    __TEXT,__text,regular,pure_instructions
    .globl    _main
    .align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq    %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    subq    $32, %rsp
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    movl    $2, -20(%rbp)          # i=2,为啥是确定-20是i变量?可以通过计算算出来~不过这里看代码也能猜出...
    movl    -20(%rbp), %edi        # 将变量i放入寄存器edi
    addl    $3, %edi               # 寄存器edi的值加3
    movl    %edi, -20(%rbp)        # 将寄存器edi的值重新赋予变量i,此时i=5
    callq    _fun                  # 这里,才开始调用fun函数
    leaq    L_.str(%rip), %rdi
    movl    %eax, -24(%rbp)
    movl    -20(%rbp), %esi
    movl    -24(%rbp), %edx
    movb    $0, %al
    callq    _printf
    movl    $0, %edx
    movl    %eax, -28(%rbp)         ## 4-byte Spill
    movl    %edx, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .cfi_endproc

    .globl    _fun
    .align    4, 0x90
_fun:                                   ## @fun
    .cfi_startproc
## BB#0:
    pushq    %rbp
Ltmp7:
    .cfi_def_cfa_offset 16
Ltmp8:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp9:
    .cfi_def_cfa_register %rbp
    movl    %edi, -4(%rbp)
    movl    -4(%rbp), %eax
    popq    %rbp
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz     "i=%d,r=%d\n"


.subsections_via_symbols


结论,在调用方法之前,就已经加好了~虽然C语言的书上已经说得很明白,但我这里还是比较蛋疼的列出汇编指令,目的也是希望楼主能举一反三~

[ 本帖最后由 神vLinux飘飘 于 2014-1-11 23:38 编辑 ]

淘宝杜琨
2014-01-11 23:30
GaZn_3130
Rank: 2
等 级:论坛游民
帖 子:4
专家分:17
注 册:2014-1-11
收藏
得分:4 
解析:
#include<stdio.h>
int fun2(int);
int main()
{
    int i=5;
    fun2(i/2);           //将参数2传进函数,i的值不变
    printf("i=%d\n",i);  //参数不变,打印出5
    fun2(i=i/2);         //这句话其实等价于i = i / 2; fun2(i);
    printf("i=%d\n",i);  //所以打印出2了
    return 0;}
int fun2(int i)
{
    i=i<=2?5:0;
    return (i);          //这里的i怎么变,和main里的i没关系
}

记得函数形参是复制传递,除非是用指针(指针也是复制传递)。你使用fun2的时候int类型,数值为i的值复制传递进fun2,在fun2里面无论你对i怎么改,改的都是i的复制品。函数结束之后这个复制品就被销毁了,和main里面的i没有任何关系。
如果你想用fun2里面的功能的话,有2种办法:
1.在main里面将fun2(参数); 改成i = fun2(参数);
2.将int fun2(int);改成int fun2(int *);

[ 本帖最后由 GaZn_3130 于 2014-1-11 23:44 编辑 ]
2014-01-11 23:35
panrui0512
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2014-1-11
收藏
得分:0 
回复 3楼 GaZn_3130
您的意思是这个自定义函数在这个程序里就没用?
2014-01-12 15:35
panrui0512
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2014-1-11
收藏
得分:0 
回复 2楼 神vLinux飘飘
真的非常感谢您能在我这儿花这么长时间,但本人不才,还没学过汇编!
2014-01-12 15:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不寫這樣的代碼,比研究出什麽結論都強。這東西跟實現有關的可能性比較多,把心思花在這等地方,本末倒置。不中聽就算了。

授人以渔,不授人以鱼。
2014-01-12 15:42
怪叔叔
Rank: 4
来 自:陕西
等 级:业余侠客
威 望:1
帖 子:113
专家分:234
注 册:2013-9-22
收藏
得分:4 
你的输出的那个i是那儿的i你知道不??
你的那个函数虽然调用了,但是有啥用??
你不防输出

    printf("i=%d\n",fun2(i/2));
   
    printf("i=%d\n",fun2(i=i/2));

试试看看结果是啥
这个才是那个fun2返回的i
而你用
    fun2(i/2);
    printf("i=%d\n",i);
    fun2(i=i/2);
    printf("i=%d\n",i)
输出的i是你那个 i/2的地方的那个i和i=i/2后算得的i;
而这个i是你的主函数中定义的i而不是那个fun2返回的i明白???
2014-01-12 20:58
xiaozi2013
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:四川成都
等 级:蒙面侠
威 望:6
帖 子:830
专家分:4331
注 册:2013-12-13
收藏
得分:0 
以下是引用TonyDeng在2014-1-12 15:42:29的发言:

不寫這樣的代碼,比研究出什麽結論都強。這東西跟實現有關的可能性比較多,把心思花在這等地方,本末倒置。不中聽就算了。



繁体字有点眼花---

--整天敲那些破代码能找着媳妇儿吗。。。---
2014-01-12 21:17
panrui0512
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2014-1-11
收藏
得分:0 
回复 7楼 怪叔叔
明白,虽然有点绕口!
2014-01-12 21:59
panrui0512
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2014-1-11
收藏
得分:0 
大家都是牛人啊,把这个问题讲解得这么透彻,而且每个人都有不同的观点,比如7楼的方法就是对三楼的补充!觉得这个论坛太好了!
2014-01-12 22:04
快速回复:调用函数
数据加载中...
 
   



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

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