***接上一篇博客:C++程序流程和循环控制及例子***
十四、三目运算
三目运算也叫条件运算或三元运算,可以实现简单if语句的功能,但是书写更简洁
语法:表达式一 ?表达式二 :表达式三
解释:先计算表达式一的值,如果为真,整个表达式的结果为表达式二的值,如果为假,整个表达式的结果为表达式三的值。
例1:判断a、b的大小
#include<iostream>
int main()
{
int a = 10;
int b = 15;
int c = a > b ? a : b;
std::cout << "大的数是:" << c << "\n";
return 0;
}
十五、函数
15.1 函数的声明和定义
在复杂的程序中,如果全部的代码都写在 main 函数中,main 函数体将非常庞大臃肿;
把任务分工到其它的函数中,main 函数只负责程序的核心流程,具体的任务由其它函数完成;
这种思想就是模块化编程。
声明和定义函数的语法:
返回值的数据类型 函数名(参数一的数据类型 参数一,参数二的数据类型 参数二,.....)
{
//实现函数功能的代码
return 返回值
}
注意:
1.函数的声明和定义可以书写在一起,也可以分开,如果书写在一起,一般放在 main 函数的上面,如果分开,一般在main 函数的上面声明,在main 函数的下面定义。
2.如果函数的声明和定义分开书写,函数的声明后面一定要有分号,函数的定义后面一定不能写分号。在同一个程序中,函数只需要声明和定义一次,也可以多次声明,但只能定义一次。函数的声明必须和函数的定义一致 (返回值的数据类型、函数名、参数列表),return 语句返回值的数据类型必须与函数的声明一致。
3.如果函数的重点是实现功能, 不必关心返回值,返回值的return 语句后面就空着。
15.2函数的调用
语法:函数名(参数一,参数二,......)
注意:
1.声明函数的代码必须放在调用之前,定义函数的代码可以放在调用之后;
2.调用函数的时候,参数列表必须与函数的声明一致(参数的个数、书写的顺序和数据类型);
3.不管在什么地方,都不能调用 main 函数,但是,在普通函数中,可以调用其它的普通函数;
4.调用函数的代码可以独占一条语句,也可以用于表达式(赋值运算、算术运算、关系运算、函
数的参数;
5.如果函数用于表达式中,返回值的数据类型要匹配(否则可能会被隐式转换或编译错误);
6.如果函数有返回值,可以不关心它,忽略它。
15.3 函数分文件编写
头文件 (*.h):需要包含的头文件,指定命名空间,声明全局变量,函数的声明,数据结构和类的声明等。
源文件 (*.cpp):函数的定义、类的定义。
主程序 : main 函数,程序的核心流程,需要用#include“头文件名"把头文件包含进来。
15.4 递归函数
递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
也就是说,递归算法是一种直接或者间接调用自身函数的算法。
通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。这就是分治的思想。
递归的三大要素
第一:明确你这个函数想要干什么。先不管函数里面的代码什么,而是要先明白,你这个函数的功能是什么,要完成什么样的一件事。
第二:寻找递归结束条件。我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
第三:找出函数的等价关系式。我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。(分治的思想,大规模问题化解成小规模问题,直到化成单一问题进行解决)
例2:斐波那契数列的递归
#include<iostream>
int Feibo(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return Feibo(n - 1) + Feibo(n - 2);
}
}
int main()
{
int n = 0;
std::cout << "输入n:";
std::cin >> n;
std::cout << "第" << n << "个斐波那契数是:" << Feibo(n) << std::endl;
return 0;
}
十六、数据类型的转换
计算机进行运算时,要求各操作数的类型具有相同的大小和存储方式。
在实际开发中,不同类型的数据进行混合运算是基本需求。
自动类型转换: 某些类型的转换编译器可以隐式的进行,不需程序员干预。
强制类型转换: 有些类型的转换需要程序员显式指定。
1)自动类型转换
不同数据类型的差别在于取值范围和精度,数据的取值范围越大,精度越高。
整型从低到高:
char -> short -> int -> long -> long long
浮点型从低到高:
float -> double -> long double
自动类型转换的规则如下:
如果一个表达式中出现了不同类型操作数的混合运算,较低类型将自动向较高类型转换。
当表达式中含有浮点型操作数时,所有操作数都将转换为浮点型。
赋值运算的右值类型与左值类型不一致时,将右值类型提升/降低为左值类型。
赋值运算右值超出了左值类型的表示范围,把该右值截断后赋给左值,所得结果可能毫无意义;
int a = 10;
double b = 20.5;
float c = a + b; // 这里a会自动转换为double类型,然后进行运算
2)强制类型转换
为了让程序设计更灵活,转换的目的更清晰,C++提供了强制类型转换的方法,也称之为显式转换
强制类型转换的语法:(目标类型)表达式;
注意:
如果使用强制转换,表示程序员已有明确的目的。
如果转换的行为不符合理,后果由程序员承担。
如果采用了强制类型转换,编译的告警信息将不再出现。
类型转换运算符的优先级比较高,如果没把握就加括号。
double d = 30.7;
int e = (int)d; // 这里我们将double类型的d强制转换为int类型,小数部分被丢弃,结果为30
十七、数据类型的别名
创建数据类型的别名有两个目的:
1、为名称复杂的类型创建别名,方便书写和记忆。
2、创建与平台无关的数据类型,提高程序的兼容性。
语法: typedef 数据类型名 别名;
#include<iostream>
using namespace std;
// 创建一个数据类型的别名
typedef int Age;
int main() {
// 使用别名定义变量
Age a = 20;
cout << "Age: " << a << endl;
return 0;
}
在这个例子中,我们创建了一个名为Age的别名,它代表int类型。然后我们在main函数中使用这个别名来定义一个变量a。这样,我们就可以像使用int一样使用Age来定义变量了。
本节完。