C++的基础语法
c++基本程序结构:
#include<iostream>
using namespace std;
int main(){
statement;
return 0;
}
#include为预处理器编译指令
int main()为函数头
using namespace为编译指令
函数体使用{}包括起来
C++ 中的分号 & 语句块
在 C++ 中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。语句块是一组使用大括号括起来的按逻辑连接的语句C++ 不以行末作为结束符的标识,因此,您可以在一行上放置多个语句
C++ 标识符
C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符,比如 @、& 和 %。C++ 是区分大小写的编程语言。
C++ 注释
程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。
C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。
C++ 注释一般有两种:
-
// - 一般用于单行注释。
-
/* … */ - 一般用于多行注释。
注释以 // 开始,直到行末为止。
C++ 数据类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
C++声明语句和变量
要将信息项存储在计算机中,必须指出信息的存储位置和所需的内存空间。在C++中,完成这种任务的一种相对简便的方法,是使用声明语句来指出存储类型并提供位置标签。
例:
int a;
这条语句提供了两项信息:需要的内存以及该内存单元的名称。具体地说,这条语句指出程序需要足够的存储空间来存储一个整数
程序中的声明语句叫作定义声明,简称为定义。
C++变量类型
布尔型(bool):
C++将非零值解释为true,将零解释为false。现在可以使用bool类型来表示真和假了,
字面值true和false都可以通过提升转换为int类型, true被转换为1,而false被转换为0
任何数字值或指针值都可以被隐式转换(即不用显式强制转换)为bool值。任何非零值都被转换为true,而零被转换为false。
字符型(char):
char类型是专为存储字符(如字母和数字)而设计的,存储数字对于计算机来说算不了什么,但存储字母则是另一回事。编程语言通过使用字母的数值编码解决了这个问题。因此, char类型是另一种整型。它足够长,能够表示目标计算机系统中的所有基本符号——所有的字母、数字、标点符号等。
在美国,最常用的符号集是ASCII字符集(参见附录C)。字符集中的字符用数值编码(ASCⅡ码)表示。
整型(int):
计算机内存由一些叫作位(bit)的单元组成,对机器而言,整数的最自然的大小。C++的short、int、long和long long 类型通过使用不同数目的位来存储值,最多能够表示4种不同的整数宽度。如果在所有的系统中,每种类型的宽度都相同,则使用起来将非常方便。例如,如short总是16位, int总是32位
short至少16位;
int至少与short一样长;
long至少32位,且至少与int一样长;
long long至少64位,且至少与long一样长
浮点数(float、double):
浮点数能够表示带小数部分的数字。
C++也有3种浮点类型:float、double和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的
float为32位, double为64位,long double 为80、96或128位
C++ 运算符:
算术运算符:
运算符 | 描述 |
---|---|
+ | 把两个操作数相加 |
- | 从第一个操作数中减去第二个操作数 |
* | 把两个操作数相乘 |
/ | 分子除以分母 |
% | 取模运算符,整除后的余数 |
++ | 自增运算符,整数值加1 |
– | 自减运算符,整数值减少 1 |
关系运算符
运算符 | 描述 |
---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 |
逻辑运算符
运算符 | 描述 |
---|---|
&& | 称为逻辑与运算符。如果两个操作数都 true,则条件为 true。 |
| | 称为逻辑或运算符。如果两个操作数中有任意一个 true,则条件为 true。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。 |
位运算符
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
算符 | 描述 |
---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; |
| | 按位或运算符,按二进制位进行"或"运算。运算规则: 0|0=0; 0|1=1; 1|0=1; 1|1=1; |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则: 0^0=0; 0^1=1; 1^0=1; 1^1=0; |
~ | 取反运算符,按二进制位进行"取反"运算。运算规则: ~1=-2; ~0=-1; |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 |
赋值运算符
下表列出了 C++ 支持的赋值运算符:
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 |
<<= | 左移且赋值运算符 |
>>= | 右移且赋值运算符 |
&= | 按位与且赋值运算符 |
^= | 按位异或且赋值运算符 |
|= | 按位或且赋值运算符 |
C++ 中的运算符优先级
运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | | | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
C++ 循环:
C++for循环:
C++ 中 for 循环的语法:
for ( init; condition; increment ) { statement(s);
}
for循环为执行重复的操作提供了循序渐进的步骤。我们来具体看一看它是如何工作的。for循环的组成部分完成下面这些步骤。
1.设置初始值。
2.执行测试,看看循环是否应当继续进行。
3.执行循环操作。
4.更新用于测试的值。
C++while循环:
语法:
C++ 中 while 循环的语法:
while(condition)
{
statement(s);
}
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。
当条件为假时,程序流将继续执行紧接着循环的下一条语句
while循环是没有初始化和更新部分的for循环,它只有测试条件和循环体。
C++ do…while 循环:
不像 for 和 while 循环,它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。
do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。
语法
C++ 中 do…while 循环的语法:
do
{
statement(s);
}while( condition );
请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。
如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。
C++ break 语句:
- 当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
- 它可用于终止 switch 语句中的一个 case。
如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。
C++ continue 语句:
C++ 中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。
对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。对于 while 和 do…while 循环,continue 语句会导致程序控制回到条件测试上。
C++ 判断:
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句
一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
C++ 中 if 语句的语法:
if(boolean_expression) { // 如果布尔表达式为真将执行的语句 }
如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。
一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
C++ 中 if…else 语句的语法:
if(boolean_expression)
{
// 如果布尔表达式为真将执行的语句
}
else
{
// 如果布尔表达式为假将执行的语句
}
如果布尔表达式为 true,则执行 if 块内的代码。如果布尔表达式为 false,则执行 else 块内的代码
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
语法
C++ 中 switch 语句的语法:
switch(expression){
case constant-expression :
statement(s); break; // 可选的
case constant-expression : statement(s); break; // 可选的
// 您可以有任意数量的 case 语句
default :
// 可选的
statement(s);
}
C++的switch语句就像指路牌,告诉计算机接下来应执行哪行代码。
每个标签都必须是整数常量表达式。最常见的标签是int或char常量(如1或’q’),也可以是枚举量。
switch中特定代码行后,将依次执行之后的所有语句,除非有明确的其他指示。程序不会在执行到下一个case处自动停止,要让程序执行完一组特定语句后停止,必须使用break语句。这将导致程序跳到switch后面的语句处执行
C++函数
函数是一组一起执行一个任务的语句。
C++程序都是由函数构成的,首先是主函数,然后主函数中调用处理问题所需的另一些函数,而这些函数中又可以调用其他函数,在递归函数中函数甚至可以调用自己。
函数的定义:
函数定义提供了函数的实际主体。
函数的定义包括:
函数的类型 函数名称(参数类型 参数){
函数主体;
函数返回值
}
例:
return_type function_name( parameter list )
{
body of the function
}
函数的声明:
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数的声明可以有多次,但函数的定义只能有一次;
方法:
只写函数定义中的函数的类型 函数名称(参数类型 参数),并以分号结束。
例:
return_type function_name( parameter list );
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:``int max(int, int);`
为什么要进行函数声明:
函数声明是为了提前告诉编译器有这个函数的存在,如果没有进行函数的声明,并在main函数中使用了该函数,那么就会报错
在解决一些简单的问题时,我们所使用的函数数量较少,我们可以将函数的定义写在main函数之前,这样就没必要声明函数了。但如果我们要解决一个十分复杂的问题,需要用到非常多的函数我们解决这个问题的时候,通常会先把大体框架构思出来,第一步实现什么,第二步又用什么函数,所以,我们可以先提前声明出来,然后在main 函数中调用,等这些写完之后,我们在细细的完善每个函数的具体实现步骤。
函数的参数:
当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。出于简化的目的,C++标准使用参数来表示实参,使用参量来表示形参,因此参数传递将参数赋值给参量
形参:
定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,形参只能是变量。
形参的本质是一个名字,不占用内存空间。
形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
实参:
可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。
注意:
1.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
2.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
3.实参与其对应的形参各占用一个存储单元
函数的调用:
调用函数
创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值
数组:
定义:
数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组特点:
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
放在连续的的内存空间中
数组中的每一个元素都是相同的数据类型
下标:我们可以通过下标访问数组中的元素
数组元素的下标是从0开始的
注:编译器不会检查使用的下标是否有效。例如,如果将一个值赋给不存在的元素months[101],编译器并不会指出错误。但是程序运行后,这种赋值可能引发问题,它可能破坏数据或代码,也可能导致程序异常,所以必须确保程序只使用有效的下标值。
一维数组的定义方法:
1.数据类型 数组名【数组长度】;
2.数据类型 数组名【数组长度】={ 值1,值2,…};
如果在初始化数据的时候,没有全部填写完,会用0来补充剩余的数据
3.数据类型 数组名【 】= {值1,值2,…};
一维数组的访问方法:
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
double salary = balance[9];
二维数组的定义方法:
1.数据类型 数组名【行数】【列数】;
2.数据类型 数组名【行数】【列数】={{数据1,数据2},{数据3,数据4}};
3.数据类型 数组名【行数】【列数】={数据1,数据2,数据3,数据4};
4.数据类型 数组名【】【列数】={数据1,数据2,数据3,数据4};
二维数组的访问方法:
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:
int val = a[2][3];
上面的语句将获取数组中第 3 行第 4 个元素