C和C++的区别(一)
来源:互联网 发布:大数据的应用状况 编辑:程序博客网 时间:2024/05/16 11:32
1、带有默认值的函数
C++可以给函数定义或者声明时给参数赋初值
现在我们学习的C语言是C89标准,没有此功能,但C99标准有。
我们知道形参入栈的时候是按从右向左的顺序依次压入栈的,看下面这段代码:
.cpp文件
#include<stdio.h>int sum(int a,int b);int main(){ int a=10; int b=20; sum(a,b); return 0;}int sum(int a,int b){ int temp; temp=a+b; return temp;}
形参入栈时反汇编是这样的:
mov eax,dword ptr[ebp-8];
push eax;
mov ecx,dword ptr[ebp-4];
push ecx;
嗯,形参是从右向左依次入栈。
那么C++为什么使用带默认值的函数?有什么好处呢?
我们修改上面的代码:声明处: int sum(int a,int b=20);
主函数调用处 sum(a);
形参的反汇编是什么: push 14h;
mov eax,dword ptr[ebp-4];
入栈的时候直接把立即数入栈,不用通过寄存器,是不是提高了效率呢!
在主函数中调用sum函数的方式还可以有哪些?
// sum(a,b); 正常的调用
sum(a); 带有默认值的函数,在函数声明处给b赋值,int sum(int a,int b=20);
sum(a,30) 把30赋给b,
sum(a)和sum(a,30)的效率无差别
反汇编形参入栈都是 push 14h
push 1eh
sum(,10),不可以哦,调用的时候要从最后一个开始赋值。因为你调用的函数定义就会变成 int sum(int a=20,int b),这是不允许的,
如果你写成这样:
int sum(int a,int b=20);
int sum(int a=10,int b);
合起来是可以的。
int sum(int a=10,int b);
int sum(int a,int b=20);
不可以
上面的代码我们把声明写在了前面,所以如果你这样写:
int sum(int a,int b)
int main()
{
.....
sum(a);
}
int sum(int a,int b=10)
{
.......
}
也是不可以的,因为函数的编译顺序是从上往下读的,这样给默认值就不可以了。
inline int sum(int a,int b){ return a+b;}int main(){int a=10;int b=20;sum(a,b); return 0;}
- C和C++的区别(一)
- C和C++区别(一)
- C学习笔记(一) C语言和汇编语言的区别
- c与c++的区别(一)
- C与C++的区别(一)
- '&'和'*' (C++)的区别
- .c 文件和 .h 文件的区别 以及 链接出错的问题(一)
- 堆和栈的区别(c/c++)
- C语言(C++)堆和栈的区别
- 结构体和类的区别(C/C++)
- 堆和栈的区别(C/C++)
- C++、VC++和C++Builder的区别
- [c/c++] typedef和define的区别
- [C/C++]Typedef和define的区别
- 【C/C++】堆和栈的区别
- [C/C++] const和#define的区别
- c:if 和c:when 的区别
- char* c和char c[]的区别
- Compilation failed: internal java compiler error
- Linux 下 ss 命令使用示例
- libreoj模拟赛day2t1
- 应用偏最小二乘回归(PLSR)对NIR光谱与样本中RON含量进行定量分析
- reids键命令
- C和C++的区别(一)
- SpringMVC中@ModelAttribute注解
- Wannafly模拟赛5 F Course
- opencv学习笔记二
- 利用MAVEN打包时,如何包含更多的资源文件
- EasyUI Combogrid的使用
- 利用shell脚本批量获取主机信息
- java提高篇(七)-----详解内部类
- oracle 12C ORA-28040