C++表达式和控制语句和函数内联


一、C++表达式和控制语句

1.C++中的数据类型

C++中的数据类型,常用的有int、char、float、double分别表示整形、字符型、单精度和双精度类型,包括它们的扩展类型与C语言中用法都一致,例如下面一段C++程序:

#include<iostream>
using namespace std;
int main()
{
    int num;//学生学号
    char sex;//性别
    double score1;//科目一成绩
    double score2;//科目二成绩
    double score3;//科目三成绩
    cout<<"Please input student's ID、‘M’ or ‘W’、score1、score2 and score3"<<endl;
    cin>>num>>sex>>score1>>score2>>score3;
    cout<<"ID:"<<num<<" "<<sex<<" Total score is:"<<score1+score2+score3<<endl;//输出该学生信息及总成绩
    return 0;
}

在这里插入图片描述

布尔类型是一种逻辑值,关键字类型为bool,定义出来的变量只有true和false两个,分别表示真和假两个值,在内存上一般只占一个字节。C++中bool类型的出现,对于想表达真假逻辑结果的值,再适合不过,填补了C语言中只能用int来替代的不足,下面请看例子程序:

#include<iostream>
using namespace std;
int main()
{
    int a=9;
    int b=10;
    bool r;//定义布尔类型变量r
    r = a>b;
    cout<<r<<endl;
    cout<<"bool size is:"<<sizeof(r)<<endl;
    return 0;
}

在这里插入图片描述

2.c++算术运算符

拆分位数,我们可以C++如下实现:

#include<iostream>
using namespace std;
int main()
{
    int a;//待判断的这个三位数
    int ge;//三位数中的个位
    int shi;//三位数中的十位
    int bai;//三位数中的百位
    cin>>a;
    ge = a%10;
    shi = a%100/10;
    bai = a/100;
    cout<<ge<<" "<<shi<<" "<<bai<<endl;
    return 0;
}

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   double x;
   double y;
   cin>>x;
  
   if(x<1)
    {
      y=x;
   }
   else if(x>=1 && x<10)
    {
      y=2*x-1;
   }
   else
    {
      y=3*x-11;
   }
   cout<<fixed<<setprecision(2)<<y<<endl;
   return 0;
}

用setprecision控制小数位数

二,C++函数调用与重载、内联

1.C++中函数调用的用法

C++中函数调用及传参的使用方法。

字符串逆序问题,代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int Reverse(char a[],char b[])
{
    int i=0,n;
    n=strlen(a);
    while(a[i]!='\0')
    {
        b[n-i-1]=a[i];
        i++;
    }
    b[n]='\0';

> 这里是引用

    return 0;
}
int main()
{
    char str1[100];
    char str2[100];
    cin>>str1;
    Reverse(str1,str2);
    cout<<str2<<endl;
    return 0;
}

本代码中自定义函数有两个形参,都为数组类型,需要传入两个数组来实现函数间的相互通信

2.C++带默认形参值的函数

在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。

一个求加法的函数,代码如下:

#include<iostream>
using namespace std;
int add(int a=3,int b=5)
{
    return a+b;
}
int main()
{
    cout<<add(10,20)<<endl;//将10和20分别给a和b
    cout<<add(30)<<endl;//将30给a,b为默认的5
    cout<<add()<<endl;//使用a、b的默认值3和5
    return 0;
}

在这里插入图片描述

由于参数的传递顺序是从右至左入栈,所以有默认值的参数必须在放在**形参列表的最右边!**另外,当函数需要提前声明时,若形参存在默认参数,则声明部分可以制定默认值,而后面的函数定义部分则不再制定默认值。

3.C++函数重载实例讲解

有时候对于同一个功能函数,可能处理的对象类型不同,则需要重新实现一遍这个函数,这样下去就显得代码更加繁多,C++为了解决这一问题,而支持函数重载来解决这个问题。

函数重载即两个或以上的函数,函数名相同,但形参类型或个数不同,编译器根据调用方传入的参数的类型和个数,自动选择最适合的一个函数来进行绑定调用,自动实现选择。

#include<iostream>
using namespace std;
int add(int a,int b)
{
    cout<<"(int ,int)\t";
    return a+b;
}
double add(double a,double b)
{
    cout<<"(doble ,double)\t";
    return a+b;
}
double add(double a,int b)
{
    cout<<"(double ,int)\t";
    return a+b;
}
double add(int a,double b)
{
    cout<<"(int ,double)\t";
    return a+b;
}
int main()
{
    cout<<add(2,3)<<endl;
    cout<<add(2.9,15.3)<<endl;
    cout<<add(10,9.9)<<endl;
    cout<<add(11.5,5)<<endl;
    return 0;
}

在这里插入图片描述

4.C++函数模板

学习了函数重载,可以处理多种数据类型,虽然是同一个名字,但仍然要分开定义,如果再能让代码精简一些,模板化,就再好不过了!为此,C++提供函数模板这一机制,大大提高代码的可重用性。

函数模板,是可以创建一个通用的函数,可以支持多种形参。用关键字template来定义,形式如下:

template<class 类型名1class 类型名2>
返回值 函数名(形参表列) 模板参数表
{
   函数体
}

第一行的template<class 类型名1,class 类型名2…>是一句声明语句,template是定义模板函数的关键字,尖括号里可以有多个类型,**前面都要用class(或者typename来定义)。**然后后面跟定义的函数模板,切记中间不可以加其他的语句,不然会报错

#include<iostream>
using namespace std;
template<class T1,class T2>
T1 add(T1 x,T2 y)
{
    cout<<sizeof(T1)<<","<<sizeof(T2)<<"\t";
    return x+y;
}
int main()
{
    cout<<add(10,20)<<endl;;
    cout<<add(3.14,5.98)<<endl;
    cout<<add('A',2)<<endl;
    return 0;
}

在这里插入图片描述

我们定义了一个add的函数模板,里面的变量类型都用T1和T2代替。

在主函数中,实际调用时,我们调用了三次,分别三种不用的类型传入,模板函数中的T1和T2类型将根据实际传入的类型变成具体类型,这个化成就叫做模板的实例化。

5.C++内联函数inline实例详解

inline内联函数
函数的调用,想必大家都用过,一个函数在被另一个函数调用的时候,才有生命,才会为其准备对应的内存空间,再调用完毕之后再清理释放结束。

每一次的函数调用都会带来一些时间和空间上的花销。而自定义函数的一个作用,也是为了提高代码的重用性,可以在需要的时候随时调用,提高开发效率。那么,一个代码本身就不多,又频繁被调用的函数,我们就该好好想想,这样做到底合算不合算了。
为我们提供了内联的机制,即仍然使用自定义函数,但在编译的时候,把函数代码插入到函数调用处,从而免去函数调用的一系列过程,像普通顺序执行的代码一样

只需要在函数定义的前面加上关键字inline声明就可以了

#include<iostream>
using namespace std;
  
inline int Max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    cout<<Max(3,5)<<endl;
    cout<<Max(7,9)<<endl;
    return 0;
}

在这里插入图片描述

内联函数的定义要在调用之前出现,才可以让编译器在编译期间了解上下文,进行代码替换。除此以外,内联函数与register变量类似,仅仅是我们提给编译器的一个请求,最终是否真正会实现内联,由编译器根据情况自行选择。

总结

春天到了,校园里的小黄花,绽放出了生命中最美好的光华。你也不能落后!
参考来自:https://www.dotcpp.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: C++中的函数宏定义和内联函数有一些区别。函数宏定义是在预编译阶段将宏名替换为宏体,它不是真正的函数,而是一种字符串替换的机制。宏定义没有类型检查,无论对还是错都会直接替换。而内联函数是真正的函数,使用inline修饰,编译器会在调用内联函数的地方展开,没有函数压栈的开销,提高了程序的运行效率。内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,如while、switch,并且内联函数本身不能直接调用自身。如果内联函数函数体过大,编译器会自动将其变为普通函数内联函数在编译阶段进行代码插入,而宏定义是在预编译阶段进行代码展开。因此,内联函数在编译时会进行类型检查,而宏定义没有类型检查。此外,内联函数的使用可以提高程序的效率,而宏定义的使用可以省去函数调用的开销。\[1\]\[2\] 然而,需要注意的是,宏定义和内联函数在使用时都是进行代码展开。对于宏定义,预处理器会将所有的宏名替换为宏体;而对于内联函数,编译器会在每处调用内联函数的地方直接将内联函数的内容展开。这样可以省去函数压栈退栈的开销,提高了程序的效率。\[2\] 举个例子来说明宏定义和内联函数的区别。假设有以下代码: #include <iostream> using namespace std; #define MAX(a,b) (a > b ? a:b) int main() { int a = 10; int b = 20; cout << MAX(a, ++b) << endl; return 0; } 这段代码中,宏定义MAX(a, b)会将a和b进行比较,并返回较大的值。在调用MAX(a, ++b)时,宏定义会将其展开为(a > ++b ? a:b)。由于宏定义是字符串替换,所以++b会被展开两次,导致b的值增加了两次。因此,输出结果为22。\[3\] #### 引用[.reference_title] - *1* *3* [C++:在代码中理解宏定义和内联函数](https://blog.csdn.net/qq_43825377/article/details/116211242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++内联函数和宏定义](https://blog.csdn.net/luolaihua2018/article/details/115377860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值