7.1.7 函数庶事

1.没有参数时,我们应该写成void f(),还是void f(void)呢.在传统c中,void f()表示f的参数表未知,并不表示没有参数.如果我们现在把之前的声明swap函数的参数表里的内容删掉,会发生什么呢?编译是通过的.是因为你这样写,就告诉编译器你有一个swap函数,但不确定里面的参数,于是编译器在main里面遇到swap时候就只能猜了.所以如果我们把下面swap的a,b的类型改为double,看看会发生什么.

a得到了0.000000,而b则得到了一个非常恐怖的数字.这是因为我们上面拿void swap()欺骗了编译器,它帮swap调用安排了两个int的传递,编译器在编译25行的时候,我们之前说过,原型的作用不仅仅只是用来检查你对函数的调用是不是对的,也用于检查你对函数的定义是是不是对的.我们上面定义void的参数是不确定的,而double自然也是两个不确定了,所以编译器没有从中发现任何问题.但实际上swap要的是两个double,而我们在main函数里给了两个int,导致传过去的类型错误,也就导致了输出错误.所以我们的建议是,希望你不要写出这样的原型,原型里面一定要把参数写全,哪怕是void.

2.逗号运算符?

  • 调用函数时的逗号和逗号运算符怎么区分?
  • 调用函数时的圆括号里的逗号是标点符号,不是运算符.但是如果你给他再加一层括号,那就表明是逗号运算符的结果.如f((a,b)).

3.函数里的函数?

c语言不允许嵌套定义.我们可以在一个函数里面放另外一个函数的原型声明,但不可以在一个函数里面定义另外一个函数.

4.这是什么?

  • int i,j,sum(int a,int b); 我们定义了int型的变量i和j,同时也声明了返回类型为int的sum函数的原型.虽然这样是合法的,但我不建议大家这样写.
  • return (i); 和return i同理,这种写法也是合法的,但是有可能让人误会,我们现在去调用return函数,编译器把i的值传递给return.所以不要这么写,没好处.

5.关于main

  • int main()也是一个函数.然后我们好像没看到它有什么参数,那要不要写成int main(void)?编译没有任何问题.所以有的地方也会强调说如果main没有参数要加上void.
  • 我们之前说过,main是c语言程序的入口,同时main也是一个函数. main函数虽然是你写的代码中第一个被执行的地方,但它不是你这个程序运行起来第一条运行的代码(如编译预处理).在main函数之前还有其他东西,它们在做完了一些准备工作之后,才回来调用你的main函数.同样也是因为这个原因,main函数最后的那句return 0是有意义的.我们的main函数结束时,会把这个0返回调用它的地方,返回给一小段代码,那段代码会用来检查main到底返回了什么东西,然后它会报告给你的操作系统.在windows里,你可以在批处理文件里面去执行你写的那个程序,然后跟上if errorlevel 1,如果你的程序返回为1去做什么事情.传统上,一个程序如果返回0,表示说它正常的运行结束了.如果它返回了任何非0的值,则表明程序在运行的过程中出现了问题.如果是unix或者linux,则可以这样去执行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值