语句

本文聚焦C++编程,介绍了语句和函数的相关知识。语句方面,涉及空语句、块语句、switch case、for范围循环、break和continue语句,以及try语句块及异常处理。函数部分,讲解了形参规则、返回类型限制、局部静态对象,还介绍了函数声明、引用形参、默认实参、内联函数等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5、语句

一些觉得重要的点

  • 空语句:单单使用一个;号来表示,空语句本身没什么意义,但有时也有作用如下:
\\读取输入值,直到遇到sought,此外不采取其他操作
while(cin>>>s&&s!="sought")
	;//空语句
  • 块语句不以分号作为结束,也即是{}后一般不跟着;号来表示块的结束,但是加了之后也只表示一个空语句,一般情况下没有影响
  • 关于switch case语句:switch(){case 整型常量表达式:...直到遇到break};有一种错觉是程序只执行匹配成功的case后语句,实际上一旦匹配成功将一直向下执行,除非遇到break;
  • 使用for的范围循环时如果要对序列中的内容进行修改,需要声明为引用类型才能成功。
  • break语句:用于终止离他最近的while、do while、for、或者switch语句,并从这些语句之后的第一条语句开始执行,只能出现在迭代语句内部或者switch语句中。
  • continue语句终止最近循环中的一次迭代,并开始下一次迭代,只能用于for循环、while语句和do while语句内部,并不会结束当前循环。

try语句块及异常处理

和java中的使用基本相同,使用成员函数what返回错误信息。

try{}
catch(runtime_error cc){cout<<cc.what()}

函数

  • 每个形参前都要有类型说明符,即使两个形参的类型是一致的。
  • 任意形参之间不能同名,而且函数最外层作用域内的局部变量也不能与形参同名。
  • java中的foreach循环不能概念变量的值,但是能改变对象的值,根本原因还是Java中声明的变量必须是和需要访问的可迭代集合的类型相同的,不能是引用类型,而对象在赋值时赋的是引用,所以修改了这个引用也相当于修改了原存储位置,而对于变量赋值就是真的赋值了;在c++中类似的for循环则可以声明成引用类型进而达到修改的作用。
  • 在c++中函数的返回类型不能是数组和函数类型,但可以是数组或者函数的指针,这个与java是很不同的,在java中返回类型可以直接是数组
  • 局部静态对象:即使定义它的函数执行结束,该变量仍然是存在的,直到程序终止。用static关键字进行修饰后,仅在第一调用时进行初始化,之后将不再进行初始化。

函数声明

函数的定义只能执行一次,但是可以声明多次,因为函数的声明时不包含函数体的因此可以不填写形参,如下void add(int,int)可以仅仅填写参数的类型。
分离式编译
形参的类型决定了其与实参的交互方式如果形参定义为引用的形式,则它将于实参进行绑定(引用传递),如果是一般的形式则会执行拷贝操作,也就是值传递
在c++中建议使用引用类型的形参来访问函数外部的对象,而不是指针类型;当不需要对实际数据进行修改时,可以将该引用设置为const型的引用,建议使用引用形参避免因为拷贝引起的时间浪费。

使用引用形参返回额外信息

默认实参

可以在函数声明时,给每一个形参一个默认值,在实际调用时,可以传入新的实参,也可以不传入而使用默认值,但是需要注意如果在形参定义中定义了一个默认实参则之后的所有参数都需要定义默认实参。默认实参只能声明一次,不能多次声明,不能修改已经存在默认实参的值,但是可以为不是默认实参的参数添加。

  • 内联函数:使用关键字inline将一个简单的函数声明为内联函数,将会使得调用时更直接的在调用处进行“展开”,从而减少拷贝参数、跳转的开销。
  • constexpr函数:

函数指针

#include <iostream>
#include <vector>
using namespace std;
int add(int value1,int value2){
	return value1+value2;

}
//使用typedef定义一种函数类型,进而可以将函数作为参数传入另一个函数
typedef decltype(add) FuncAdd;
//其实是自动转化为函数形参指针,注意关键字decltype使用
int add_test(int value1,int value2,FuncAdd add){
	return add(value1,value2);
}
//一种等价的方式,更直观但是更复杂
int add_test_1(int value1,int value2,int pf(int,int)){
	return pf(value1,value2);
}
int main(){
	//声明一个存放某种函数类型的指针的vector
	vector<FuncAdd*> ve;
	//声明一个这种指针并进行初始化
	FuncAdd *add_pointer=add;
	//放入vector中
	ve.push_back(add_pointer);
	//v.push_back(add);
	//进行调用
	cout<<ve[0](5,6)<<endl;
	cout<<add_test(1,2,add)<<endl;
	cout<<add_test_1(1,3,add)<<endl;
}
//typedef本身就是一种自定义类型的工具
//编译器会把函数类型转化为指针类型,也可以直接声明指针类型,传入指针类型
//牢记函数是不能返回函数的,但是能返回函数指针,decltype函数如果作用于函数返回的是
//函数类型而不是指针类型,如果作为返回值声明需要进行显式指明,比如decltype(add) *add_test(int,int);
//表明返回类型是一个指向add函数类型的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值