精华内容
下载资源
问答
  • 深度剖析c语言main函数---main函数返回值

    万次阅读 多人点赞 2018-07-09 23:19:06
    在接下来的篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。 main函数的返回值  main函数的返回值用于...

      在接下来的几篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。

    main函数的返回值

      main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。

    void main()

      有一些书上的,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 “The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.”
      这可能是因为 在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main() 可以通过编译,但并非所有编译器都支持 void main() ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,为了程序拥有很好的可移植性,一定要用 int main ()。
      测试如下:
      

    #include <stdio.h>
    
    void main()
    {
        printf("Hello world\n");
        return;
    }
    

    运行结果:g++ test.c
    这里写图片描述

    main()

      那既然main函数只有一种返回值类型,那么是不是可以不写?规定:不明确标明返回值的,默认返回值为int,也就是说 main()等同于int main(),而不是等同于void main()。在C99中,标准要求编译器至少给 main() 这种用法来个警告,而在c98中这种写法是被允许的。但为了程序的规范性和可读性,还是应该明确的指出返回值的类型。
      测试代码:
      

    #include <stdio.h>
    
    main()
    {
        printf("Hello world\n");
        return 0;
    }

    运行结果:
    这里写图片描述

    C和C++的标准

      在最新的 C99 标准中,只有以下两种定义方式是正确的:

           int main( void ) 
    
           int main( int argc, char *argv[] ) 
    

      若不需要从命令行中获取参数,就使用int main(void) ;否则的话,就用int main( int argc, char *argv[] )。当然参数的传递还可以有其他的方式,在下一个文章中,会单独来讲。 main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的调用者(如操作系统),等同于 exit(0),来判断函数的执行结果。

    C++98 中定义了如下两种 main 函数的定义方式:

          int main( ) 
    
          int main( int argc, char *argv[] ) 
    

      int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char*argv[] ) 的用法也和C99 中定义的一样。同样,main函数的返回值类型也必须是int。

    return 语句

      如果 main 函数的最后没有写 return 语句的话,C99 和c++98都规定编译器要自动在生成的目标文件中加入return 0,表示程序正常退出。不过,建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。
      在linux下我们可以使用shell命令:echo $? 查看函数的返回值。
      
      

    #include <stdio.h>
    
    int main()
    {
        printf("Hello world\n");
    }

    运行结果:
    这里写图片描述
      
      同时,需要说明的是return的返回值会进行 类型转换,比如:若return 1.2 ;会将其强制转换为1,即真正的返回值是1,同理,return ‘a’ ; 的话,真正的返回值就是97,;但是若return “abc”; 便会报警告,因为无法进行隐式类型转换。

    测试main函数返回值的意义

      前文说到,main函数如果返回0,则代表程序正常退出。通常,返回非零代表程序异常退出。在本文的最后,测试一下:
      
    test.c

    #include <stdio.h>
    
    int main()
    {
        printf("c 语言\n");
        return 11.1; 
    }

    在终端执行如下:

    ➜  testSigpipe git:(master) ✗ vim test.c
    ➜  testSigpipe git:(master) ✗ gcc test.c
    ➜  testSigpipe git:(master) ✗ ./a.out && echo "hello world"  #&&与运算,前面为真,才会执行后边的
    c 语言
    

      可以看出,操作系统认为main函数执行失败,因为main函数的返回值是11

    ➜  testSigpipe git:(master) ✗ ./a.out 
    ➜  testSigpipe git:(master) ✗ echo $?
    11
    

    若将main函数中返回值该为0的话:

    ➜  testSigpipe git:(master) ✗ vim test.c
    ➜  testSigpipe git:(master) ✗ gcc test.c 
    ➜  testSigpipe git:(master) ✗ ./a.out && echo "hello world" #hello
    c 语言
    hello world
    

      可以看出,正如我们所期望的一样,main函数返回0,代表函数正常退出,执行成功;返回非0,代表函数出先异常,执行失败。

      在下文中会对main函数的参数的使用做一总结。

    展开全文
  • 函数指针,指针函数返回值为指针的函数

    万次阅读 多人点赞 2017-06-08 21:23:17
    在学习C语言时,一比较容易混淆的概念就是函数指针、指针函数返回值为指针的函数。本文将对这三概念进行区分。指针函数就是返回值为指针的函数,两本质上是同一事物,只是叫法不同。函数指针就是一指向...

    摘要:

    在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函数的指针,本质上是一个指针,只是这个指针指向的对象是函数,而不是一般意义上的存储对象。

    正文:

    指针函数

    指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

    定义

    指针函数的定义格式如下:函数类型 *函数名([参数列表])

    当然,也可以让指针标志*与函数类型紧贴在一起,与函数名分开,其含义一致,格式如下:函数类型* 函数名([参数列表])

    相比上一种,这种方式更能表示这是一个指针函数。在将指针函数与函数指针区分时,也可以通过“指针标志*能否和函数名分离”来判断这个一个指针函数,还是一个函数指针。

    返回值问题

    指针函数的使用和一般函数的使用相同,但需注意返回值问题。对于一个返回值为指针的函数,不能返回auto型局部变量的地址,但可返回static型变量的地址。

    这是因为auto型变量的生存周期很短,当函数返回时,auto型变量的内存空间将被释放,如果返回值是auto型变量,那么这个返回指针将无效,变成野指针。而static类型变量占用的内存空间则不会因为函数返回而被释放,不会出现野指针问题。

    所以编写指针函数使要注意返回值。总体原则是:返回的指针对应的内存空间不会因函数返回则被释放掉。常用的返回指针有以下几种:

    (1)      函数中动态分配内存空间(通过malloc等实现)的首地址;

    (2)      静态变量(static)或全局变量所对应的变量的首地址;

    (3)      通过指针形参所获得的实参的有效地址。

    函数指针

    函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

    定义

    函数指针的定义格式如下:函数类型 (*指针变量) ([参数列表])

    在形式上,函数指针的特征是使用一个括号包裹指针标志和指针变量,将括号移除,函数指针就变成指针函数。

    之所以容易混淆指针函数和函数指针,是因为指针函数的形式如一般指针变量类型,如:int *x、int *y()、int(*z)()

    这里x和z表示一个指针,而y则表示一个函数,所以要注意区分指向变量的指针和指向函数的指针的形式区别。

    赋值

    函数指针的赋值操作:

    使用函数名给指向函数的指针变量赋值。其赋值的一般格式如下:函数指针 = [ &] 函数名;

    其中,函数名后不能带括号和参数,函数名前的&是可选,建议不要使用。

    调用

    函数指针调用格式:函数指针变量([实参列表]); 或 (*函数指针变量)([实参列表]);

    推荐第二种用法。这种方法可以很好的表明这是一个函数。而第一种方法则很容易造成误导。

    之所以容忍一种调用方法是因为ANSI C 委员会决定容许这种普通函数调用句法。这是因为编译器知道它是一个指向函数的指针,并且它还知道在该环境下所能做的惟一的一件事就是调用函数,因此这里没有任何模糊不清的表达。

    使用场景

    函数指针的常见用途就是把函数指针作为参数传递给函数。

    一个函数通过由运行时决定的指针来调用另一个函数的行为叫做回调(callback)。用户将一个函数指针作为参数传递给其它函数,后者将“回调”用户的函数。这样就可实现通过同一接口实现对不同类型数据、不同功能的处理。

    展开全文
  • vb中连接两个函数返回值的方式是什么,怎么将两函数的返回值结合起来,怎么实现不同类型的函数的调用?
  • 函数有个返回值

    千次阅读 2019-11-23 19:08:47
    //无参多个返回值函数 func myfunc01( ) (int,int,int) { return 1,2,3 } //go官方推荐方法 func myfunc02( ) (a int,b int,c int) { a,b,c = 111,222,333 return } func myfunc03( ) (a,b,c int) { a,...

    package main
    import “fmt”
    //无参多个返回值的函数
    func myfunc01( ) (int,int,int) {
    return 1,2,3
    }
    //go官方推荐方法
    func myfunc02( ) (a int,b int,c int) {
    a,b,c = 111,222,333
    return
    }
    func myfunc03( ) (a,b,c int) {
    a,b,c = 444,555,666
    return
    }
    func main ( ) {
    //函数调用
    a,b,c := myfunc01( )
    fmt.Printf(“a = %d,b = %d,c = %d\n”,a,b,c)
    a,b,c := myfunc02( )
    fmt.Printf(“a = %d,b = %d,c = %d\n”,a,b,c)
    a,b,c := myfunc03( )
    fmt.Printf(“a = %d,b = %d,c = %d\n”,a,b,c)
    }

    展开全文
  • 拿JS异步函数返回值种方式

    万次阅读 2018-08-31 13:54:13
    在我们的编码过程中,为了满足业务需求,经常需要获取JS异步函数返回值。今天就来汇总一下拿值的种方式。 1,通过回调函数的方式来拿返回值,这想必大家不会陌生 function getSomething(cb) { var r = 0; ...

    在我们的编码过程中,为了满足业务需求,经常需要获取JS异步函数的返回值。今天就来汇总一下拿值的几种方式。
    1,通过回调函数的方式来拿返回值,这个想必大家不会陌生

    function getSomething(cb) {
        var r = 0;
        setTimeout(function() {
            r = 2;
            cb(r)//回调函数
        },10)
    }
    function compute(x) {
        alert(x * 2);
    }
    getSomething(compute);

    2.通过promise的方式,这个之前有做过详细的介绍

    function getSomething() {
        var r = 0;
        return new Promise(function(resolve) {
            setTimeout(function(){
                r = 2;
                resolve(r);
            },10)
        })
    }
    function compute(x) {
        alert(x * 2);
    }
    getSomething().then(compute);

    3.通过async的方式

    function getSomething() {
        var r = 0;
        return new Promise(function(resolve) {
            setTimeout(function() {
                r = 2;
                resolve(r);
            },10)
        })
    }
    async function compute() {
        var x = await getSomething();
        alert(x * 2);
    }
    compute();

    4.通过generator方式实现

    function getSomething() {
        var r = 0;
        setTimeout(function() {
            r = 2;
            it.next(r);
        },10);
    }
    function *compute(it) {
        var x = yield getSomething();
        alert(x * 2);
    }
    var it = compute();
    it.next();
    //同步的写法实现异步的逻辑

    5.通过promise和generator相结合的方式

    function getSomething() {
        var r = 0;
        return new Promise(function(resolve) {
            setTimeout(function() {
                r = 2;
                resolve(r);
            },10)
        })
    }
    function *compute() {
        var x = yield getSomething();
        alert(x * 2);
    }
    var it = compute();
    it.next().value.then(function(value) {
        it.next(value);
    })
    展开全文
  • 关于printf函数返回值

    千次阅读 多人点赞 2019-01-06 20:54:38
    初学C语言时用的最多的函数就是printf函数,而printf函数返回值是被大多数人忽略的,以至于很多应聘者在碰到关于printf返回值的编程时一头雾水。确实很少人会注意到这,接下来就谈一谈printf返回值的问题。 先看...
  • laravel 操作数据库常用函数返回值

    千次阅读 2018-12-15 21:57:29
    insert函数返回值为boolean类型:成功为true,失败为false insertGetId函数返回值为整型:成功为插入时的ID值,失败为… DB::table('users')-&amp;amp;amp;amp;gt;insert( ['name' =&amp;amp;amp;amp;...
  • printf函数返回值

    千次阅读 2017-01-07 16:19:29
    先看下面一段程序: #include int main() { int i = 123; printf("%d\n",printf("%d",printf("%d",i))); return 0;...printf函数里面又嵌入了printf...对于这运行结果,你怎么看? 我们来一步步分解printf函数,看看
  • 1、函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下: [function] funname [()]{ 函数体 [return int;] } 格式1: 简化写法,不写 function 关键字: ...
  • VB编程怎么在返回值的类型中再嵌套一个函数返回值类型?我想返回给几个控件应该怎么做?
  • 关于函数返回值种情况

    千次阅读 2012-11-10 18:46:37
    关于函数返回值种情况  在一函数的内部,return的时候返回的都是一拷贝,不管是变量、对象还是指针都是返回拷贝,但是这拷贝是浅拷贝。 分为以下种情况:1)返回一基本类型的变量;2)返回非动态...
  • recv函数说明返回值

    千次阅读 2015-09-11 23:37:30
    客户端的程序连接上服务器后recv函数阻塞接受,有时会返回0,说明接收超时服务器主动断开了连接,需要重新connect服务器,但重新connect时会报“Transport endpoint is already connected”!!!返回0时正确处理...
  • 关于函数返回值有的情况

    千次阅读 2016-09-07 21:34:06
    函数的输出参数怎么办?通常的解决方法两种,一 是使用”引用”,把输出参数当作可变的输入参数传进来,二是把所有输出参数打包成 一结构体,返回整个结构。两种方法各有千秋,下面提供例子。 a除以b的...
  • C语言函数返回值 参数

    千次阅读 2021-03-24 10:29:54
    函数被调用时,才申请了该内存空间,才了这变量,同时这空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数。 何时释放了该空间: 函数执行结束后,该空间由内存管理单元自动回收...
  • main中第二步执行时首先调用复制构造函数对应传入的对象b生成一临时对象(temp),return时再次调用复制构造函数生成一临时对象用于返回,然后temp析构,按书上说的此刻程序就走完了,但是在main中这一步Example...
  • 拿到JS异步函数返回值种方式

    千次阅读 2020-01-19 10:44:19
    在我们的编码过程中,为了满足业务需求,经常需要获取JS异步函数返回值。今天就来汇总一下拿值的种方式。 1,通过回调函数的方式来拿返回值,这想必大家不会陌生 function getSomething(cb) { var r = 0; ...
  • 自调用函数也是匿名函数的一种表现形式,这个函数在定义之后,直接调用。如下 (  function(){   alert('haha');  }  )()  看起来还挺怪异,不过确实很简单。  自调用函数很方便使用,可以不用...
  • Swift2.0语言教程之函数返回值函数类型
  • C语言总结之函数返回值

    千次阅读 2013-11-24 19:50:15
    关于这个问题,大家应该在很多书上看到过: 1.函数返回值不可以是局部变量; 2.函数内的局部变量在...先找几个常见的例子一步一步深入说明。 #include #include int add_rtVal(int a,int b) { int c = 0; c =
  • 获取JavaScript异步函数返回值

    千次阅读 2017-12-21 11:24:50
    今天研究一小问题: 怎么拿到JavaScript异步函数返回值? 1.错误尝试 当年未入行时,我的最初尝试: ? function getSomething() { var r = 0; setTimeout(function() { r = 2; }, 10); ...
  • 调用函数 baseStation.flow(newList[i].element_name...我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下点新功能,帮助你用它写博客: 全新的界面设计 ,将会...
  • 关于Vector作为函数返回值

    万次阅读 2015-01-19 15:25:53
    关于Vector作为函数返回值有几点需要说明:  1.首先如果Vector是一局部的变量,那么返回该Vector的引用是十分危险的,因为在Vector超出作用域的,会自动调用相关的析构函数(~Vector()),如果Vector中存放的...
  • 网上找了好多文章都没有提到这东西,没有说明 wavedec2 函数各个返回值究竟是什么意思         我们先看看 wavedec2 函数的大概形式, pywt.wavedec2(data, wavelet, mode=’symmetric’, ...
  • 在移植wifi的代码时,遇到了一些与下面类似的函数,这些函数不只一return,这可是新鲜的玩意儿: int func (int b) { int a=5; if (a>b) return a; else return b; return 0; }  原来C/C++ 中,...
  • 调用完之后不知道怎么获取返回值,于是乎用上了 $(func_name) 来获取,然后踩了几个坑 查看教程之后发现要用 $? 来获取刚刚执行的函数返回值, function func1() { echo 1 return 2 echo 3 } res=$(func1) ...
  • SQL Server 存储过程返回值种方式

    千次阅读 2018-11-21 17:58:58
    获得存储过程返回值–通过查询分析器获得 (1)不带任何参数的存储过程(存储过程语句中含有return) —创建存储过程 CREATE PROCEDURE testReturn AS return 145 GO —执行存储过程 DECLARE @RC int ...
  • c语言函数返回值问题

    千次阅读 2017-04-23 22:00:06
    C语言中,调用函数结束时,如果返回值,会涉及到函数返回值传递问题,根据返回值的大小,会不同的处理方式。 一、返回值小于等于4字节 函数执行完毕后,如果返回值小于等于4字节,则会将值保存在寄存器eax中...
  • 函数返回值种情况

    千次阅读 2012-04-08 21:00:19
    在一个函数的内部,return的时候返回的都是一拷贝,不管是变量、对象还是指针都是返回拷贝,但是这拷贝是浅拷贝。   1. 如果返回一基本类型的变量,比如: int a; a = 5; return a;   ...
  • 一天,我正愉悦地写着函数,突然,我想让这个函数返回多值, 一下子懵逼了呀 无奈之下,只好翻阅资料,整理了这篇文章 本文的结构如下: 1.三种函数返回多个返回值的方法: ​     1.全局变量法(慎...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,491
精华内容 190,196
关键字:

函数过程的返回值有几个