return i++和可变参数
来源:互联网 发布:adobe全套软件下载 编辑:程序博客网 时间:2024/06/04 18:47
先看一段代码
运行结果
开始感觉奇怪:明明i加1了为什么返回7,又或者为什么返回7而i加1了。return之后这个函数不是应该结束吗?。。。。。。
查了一些资料,终于明白了,根本问题在于i++这个表达式。这个表达式的作用是将i的值加1,重点是他有返回值,返回值是加1之前的i。ok,一切都明了了,最后返回7,i的值为8也很正常了啊,因为人家return返回了表达式的值啊。
记得当初本科学c的时候,老师总是说i++是先用后加,++i是先加后用,其实用表达式的返回值说明一下貌似更清晰啊。
下一个问题
我们把main函数修改一下
运行结果
额。。。为什么不是7 7 8呢,这个关系到可变参数的问题。
int printf(const char *format, ...);
这个是printf的函数原型,对于可变参数函数的那些参数会自右向走放入栈中,第一个参数当然就位于栈定了。ok啦,关键出来了,它是自右向左的,所以当然是8 7 7了。
static int i=7;int test1(){ return i++;}int main(){ printf("%d\n",test1()); printf("%d\n",i); return 0;}
运行结果
78
开始感觉奇怪:明明i加1了为什么返回7,又或者为什么返回7而i加1了。return之后这个函数不是应该结束吗?。。。。。。
查了一些资料,终于明白了,根本问题在于i++这个表达式。这个表达式的作用是将i的值加1,重点是他有返回值,返回值是加1之前的i。ok,一切都明了了,最后返回7,i的值为8也很正常了啊,因为人家return返回了表达式的值啊。
记得当初本科学c的时候,老师总是说i++是先用后加,++i是先加后用,其实用表达式的返回值说明一下貌似更清晰啊。
下一个问题
我们把main函数修改一下
int main(){ printf("%d %d %d\n",i,test1(),i); return 0;}
运行结果
8 7 7
额。。。为什么不是7 7 8呢,这个关系到可变参数的问题。
int printf(const char *format, ...);
这个是printf的函数原型,对于可变参数函数的那些参数会自右向走放入栈中,第一个参数当然就位于栈定了。ok啦,关键出来了,它是自右向左的,所以当然是8 7 7了。
但是啊,事实没有 这么简单啊,关于多个参数的处理顺序,c并没有给出标准啊,所以不同的编译器可能采取不同的处理方法,运行结果也就不同了哈。
综上所述,还是别用这种模糊的写法了。
- return i++和可变参数
- 8、函数的参数问题、参数传值、return返回值、可变函数和匿名函数
- 默认参数和可变参数
- #、##和可变参数宏__VA_ARGS__
- 静态导入和可变参数
- 可变参数 和 lua test
- 静态导入和可变参数
- python 可变参数和lambda
- 枚举类型 和 可变参数
- 省略号和可变参数模板
- 省略号和可变参数模板
- 省略号和可变参数模板
- 省略号和可变参数模板
- 整形计算器和可变参数
- 可变参数的函数和可变参数宏
- 可变宏参数个数和可变函数参数个数
- PHP 可变参数 ( ... ) 和参数解包
- return i++
- poj3013 最短路
- uva 972 Horizon Line 扫描线
- 又坑了一天
- EL与JSTL
- 深刻理解Linux进程间通信(IPC)
- return i++和可变参数
- 【2014校招】阿里研发面试
- HTML5里面的一个知识:Canvas二层与KineticJS完成事件!
- J2ME开发环境配置(MyEclipse插件+WTK+jdk)
- 1004:Financial Management
- 我的博客地址
- C++/C 面试
- 软件安装 RPM , SRPM 与 YUM功能
- 树状dp+条件优化(UVa 10859) 自己找代码的妙处啊