1、C++基础语法
1、C++程序的基本结构
C++程序的基本结构由以下几部分组成:
-
预处理指令(Preprocessor Directives):这部分主要包括一些库的引用。例如
#include <iostream>
就是一条预处理指令,用于引入名为iostream的库,以便我们可以使用C++的输入输出功能。初学者,可以直接使用万能头文件 -
名字空间:指明程序采用的名字空间是为了在C++新标准中,解决多数人同时编写大型程序时名字产生冲突的问题。
-
主函数(Main Function):C++程序的执行始于主函数。主函数通常形如
int main()
,括号内可以包含参数,如命令行参数等。 -
变量定义(Variable Definitions):在程序中,我们需要定义各种变量以存储和处理数据。
-
函数声明和定义(Function Declarations and Definitions):函数是用于执行特定任务的代码块。你可以在程序中声明和定义你自己的函数。
-
语句与表达式(Statements & Expressions):语句通常是执行某种操作或执行一组操作的指令。表达式是一种计算并返回值的指令。
-
注释(Comments):注释用于解释代码的功能,提高代码的可读性。在C++中,你可以使用
//
来创建单行注释,或者使用/* ... */
来创建多行注释。
以下是一个包含了以上所有元素的基本C++程序示例:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
在这个程序中,首先引入了iostream库,然后定义了主函数和一个名为printMessage的函数。在主函数中,定义了一个变量number,然后打印出这个变量的值,接着调用printMessage函数。printMessage函数的功能是打印出一条消息。
C++必会程序框架:
C++ | |
---|---|
1 2 3 4 5 6 |
|
2、C++常见的数据类型
C++支持多种数据类型,这些数据类型决定了数据的大小和存储方式,以及对数据进行的操作。以下是C++主要的数据类型:
1、基本内置类型
-
整数类型:如
int
,short
,long
,long long
。它们有符号(signed
)和无符号(unsigned
)版本,无符号版本不能表示负数。 -
字符类型:如
char
,主要用于存储字符,但实际上也是整数类型。 -
布尔类型:
bool
,其值可以是true
或false
。 -
浮点类型:如
float
,double
,long double
,用于存储浮点数,也就是小数。
基本内置类型的大小和取值范围可能会根据实现(即编译器和硬件平台)有所不同。下面的信息是基于一个典型的64位系统:
类型 | 字节大小 | 取值范围 |
---|---|---|
bool |
1 | true or false |
char |
1 | -128 到 127 或 0 到 255 |
signed char |
1 | -128 到 127 |
unsigned char |
1 | 0 到 255 |
short |
2 | -32,768 到 32,767 |
unsigned short |
2 | 0 到 65,535 |
int |
4 | -2,147,483,648 到 2,147,483,647 |
unsigned int |
4 | 0 到 4,294,967,295 |
long |
8 (在64位系统上) | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long |
8 (在64位系统上) | 0 到 18,446,744,073,709,551,615 |
long long |
8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long long |
8 | 0 到 18,446,744,073,709,551,615 |
float |
4 | 约 ±1.8e−38 到 ±3.4e+38,6 位有效数字 |
double |
8 | 约 ±2.2e−308 到 ±1.8e+308,15 位有效数字 |
long double |
8 to 16 (取决于实现) | 精度通常比double 高 |
注意:上述表格中的信息可能会因编译器、硬件平台、操作系统等因素有所不同,可以使用C++的sizeof
函数来获取特定系统上类型的实际大小。例如,sizeof(int)
会返回int
类型在当前系统中的字节大小。
2、复合类型
- 数组:存储同类型数据的连续集合。
- 字符串:存储字符的数组,通常以空字符(
'\0'
)结束。 - 指针:存储其他类型数据的内存地址。
- 引用:别名,对其他变量的引用。
3、用户自定义类型
- 枚举类型:如
enum
,枚举类型是由用户定义的类型,其值是由列举的一组命名的值。 - 类:由用户定义的类型,它封装了数据和操作数据的函数。
- 结构体:如
struct
,它可以将不同类型的数据组合在一起。 - 联合体:如
union
,联合体中的所有成员占据同一块内存,但只能存储其中的一种类型。
3、C++的变量与常量
在C++中,变量是程序操作的基本单位,每个变量都有特定的类型,决定了变量可以存储哪种类型的数据,以及在内存中占用多少空间。
1.变量的声明和定义
在C++中,声明一个变量通常包括类型和变量名,比如:
C++ | |
---|---|
1 |
|
在这个例子中,我们声明了一个类型为int(整数)的变量,名为number。这样的声明也叫做定义,因为我们创建了一个新的名为number的变量。
有时,你可以在声明的时候初始化变量,如:
C++ | |
---|---|
1 |
|
在这个例子中,我们声明了一个整型变量number,并将其初始化为10。
2.变量的类型
C++中有多种数据类型,包括:
- 基本类型(如
int
,char
,double
,bool
) - 复合类型(如数组、结构体、类)
- 指针类型
- 引用类型
每种类型都有特定的大小,决定了变量在内存中占用多少空间,以及能存储的数据的范围。
3.变量的命名规则
在C++中,你可以为变量自由地选择名称,但是必须遵守以下规则:
- 变量名称可以包含字母、数字和下划线符:例如,
myVariable
,variable1
和variable_name
都是有效的变量名称。 - 变量名称必须以字母或下划线开始:例如,
myVariable
和_myVariable
都是有效的变量名称,但1myVariable
则不是。 - 变量名称不能包含空格:例如,
my Variable
是无效的变量名称。 - 变量名称是区分大小写的:
myVariable
和myvariable
是两个不同的变量。 - 变量名称不能是C++的保留字或关键字:例如,
int
,double
,if
等都是C++的关键字,不能作为变量名。 - 变量名的长度没有限制,但是通常我们建议使用能够清楚反映变量含义的较短的名称。
另外,为了提高代码的可读性和可维护性,通常我们会遵循一些命名习惯或者约定,例如:
- 使用描述性的变量名称,比如
age
、firstName
等,而不是a
、b
、c
等。 - 变量名称全部小写,单词之间用下划线连接,如
my_variable
。 - 或者使用"camel case"风格,即除第一个单词外,其他单词首字母大写,如
myVariable
。
4.变量的作用域
在C++中,变量的作用域决定了在哪里可以访问变量。C++有以下几种作用域:
- 局部作用域:在函数或一个代码块内声明的变量,在函数或代码块外部是不可见的。
- 全局作用域:在函数外部声明的变量,全局可见。
- 命名空间作用域:在命名空间中声明的变量,在同一命名空间内可见,或者在其他地方使用命名空间修饰符可见。
5.变量的赋值
在 C++ 中,赋值操作是非常常见的。赋值操作通常使用赋值运算符 =
,其左边是要赋值的变量,右边是要赋给变量的值或表达式。
C++ | |
---|---|
1 2 |
|
在这个例子中,我们先声明了一个名为 myVariable
的整型变量,然后将其值设置为 5。
我们也可以在声明变量的同时对其进行初始化,也就是赋值:
C++ | |
---|---|
1 |
|
在这个例子中,我们在声明 myVariable
的同时给它赋了一个初始值 5。
赋值操作可以对任何类型的变量进行,包括整数、浮点数、字符、字符串等。赋值表达式的右边可以是常数、变量、运算式或函数返回值等。
C++ | |
---|---|
1 2 3 4 5 |
|
需要注意的是,赋值操作是有方向的,只能从右到左。也就是说,赋值操作的左边必须是一个变量,不能是常数或表达式。例如,5 = myVariable;
和 3 + 2 = sum;
都是错误的赋值操作。
6.常量
在C++中,你可以声明一个变量为常量,表示其值不能被改变。这可以通过const
关键字来实现,如:
C++ | |
---|---|
1 |
|
在这个例子中,我们声明了一个常量整型变量number,并将其初始化为10。一旦定义,number的值就不能被改变。
4、C++的输入与输出
1.cin/cout 输入与输出
1.输入(cin)
cin
是最常用的输入对象,它是 istream
类的一个实例。我们通常使用提取操作符 >>
从 cin
对象中提取数据。
2.输出(cout)
cout
是最常用的输出对象,它是 ostream
类的一个实例。我们通常使用插入操作符 <<
将数据插入到 cout
对象中以输出数据。
C++中的格式化输出主要依赖于<iomanip>
库,该库包含了一系列格式控制操作符。下面是一些常见的格式化操作符:
格式化操作符 | 描述 |
---|---|
setw |
设置下一个输出字段的宽度 |
setfill |
设置填充字符。和setw一起使用,可以在输出字段两侧填充指定字符 |
setprecision |
设置输出的浮点数精度 |
fixed |
设置浮点数的输出格式为定点表示法(而不是科学计数法) |
scientific |
设置浮点数的输出格式为科学计数法 |
left |
设置输出的对齐方式为左对齐 |
right |
设置输出的对齐方式为右对齐 |
internal |
设置输出的对齐方式为内部对齐(数值的符号位在左侧,数值的填充字符在中间,数值在右侧) |
dec |
设置整数的输出格式为十进制 |
hex |
设置整数的输出格式为十六进制 |
oct |
设置整数的输出格式为八进制 |
boolalpha |
设置布尔值的输出格式为字符串"true"或"false",而不是整数1或0 |
noboolalpha |
取消boolalpha的效果,布尔值将输出为整数1或0 |
showbase |
使整数的输出包含进制的基(例如,十六进制数会以0x开头) |
noshowbase |
取消showbase的效果 |
showpoint |
使浮点数的输出总是包含小数点和小数部分的0 |
noshowpoint |
取消showpoint的效果 |
showpos |
使正数的输出包含正号 |
noshowpos |
取消showpos的效果 |
uppercase |
使十六进制数的字母和科学计数法的e使用大写字母 |
nouppercase |
取消uppercase的效果 |
2.scanf/printf 输入与输出
scanf
和 printf
是C语言中用于输入和输出的函数,也可以在C++中使用。它们是 <stdio.h>
(在C++中通常使用 <cstdio>
)库中的函数。
1.scanf
scanf
函数用于格式化输入。它的用法和 printf
类似,但是 scanf
需要提供变量的地址(通过 &
操作符获取),因为它需要修改变量的值。
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
在这个例子中,scanf
函数会等待用户输入一个整数,然后将这个整数的值赋给 number
变量。
需要注意的是,虽然 scanf
和 printf
在某些情况下可以使用,但它们没有C++中的 cin
和 cout
那么安全和易用。在C++中,建议优先使用 cin
和 cout
进行输入和输出操作。
2.printf
printf
函数用于格式化输出。它的第一个参数是一个格式字符串,其中包含了一些格式指定符。之后的参数是要输出的值。
C++ | |
---|---|
1 2 3 4 5 6 7 |
|
在这个例子中,%d
是一个格式指定符,表示一个整数。printf
函数会将 number
的值插入到 %d
的位置。
以下是printf和scanf函数中的一些常见格式说明符,以及对应的数据类型:
格式说明符 | 对应的数据类型 | 描述 |
---|---|---|
%d 或 %i | int | 以十进制形式输出/输入整数 |
%u | unsigned int | 以十进制形式输出/输入无符号整数 |
%o | unsigned int | 以八进制形式输出/输入无符号整数 |
%x 或 %X | unsigned int | 以十六进制形式输出/输入无符号整数,使用 %x 输出小写字母,%X 输出大写字母 |
%f | float 或 double | 输出/输入浮点数或双精度浮点数(%n.mf,表示宽度为n,保留m位小数) |
%lf | double | 用于输入双精度浮点数 |
%e 或 %E | float 或 double | 以科学计数法输出/输入浮点数或双精度浮点数 |
%g 或 %G | float 或 double | 自动选择%f或%e(%E),以输出更短、更精炼的值 |
%c | int 或 char | 输出/输入一个字符 |
%s | char * | 输出/输入一个字符串 |
%p | void * | 以十六进制形式输出一个指针的值 |
%n | int * | 到目前为止输出的字符数会被写入到指针指向的位置 |
%% | 无 | 输出一个%字符 |
注意,对于scanf函数,对于字符串或数组类型,不需要使用&符号获取变量的地址,因为它们本身就是地址。
5、C++的算术运算符
在C++中,算术运算符用于执行常见的数学运算。以下是C++中常见的算术运算符:
- 加法运算符(+):用于两个数相加。
C++ | |
---|---|
1 2 3 |
|
- 减法运算符(-):用于两个数相减。
C++ | |
---|---|
1 2 3 |
|
- 乘法运算符(*):用于两个数相乘。
C++ | |
---|---|
1 2 3 |
|
- 除法运算符(/):用于两个数相除。如果两个操作数都是整数,那么结果是整数除法。如果至少一个操作数是浮点数,那么结果是浮点数除法。
C++ | |
---|---|
1 2 3 4 5 6 7 |
|
- 求余运算符(%):用于求两个整数相除的余数。注意:这个运算符只能用于整数。
C++ | |
---|---|
1 2 3 |
|
- 自增运算符(++):用于将变量的值增加1。
C++ | |
---|---|
1 2 |
|
- 自减运算符(--):用于将变量的值减少1。
C++ | |
---|---|
1 2 |
|
请注意,自增和自减运算符有两种形式:前置(如 ++a
或 --a
)和后置(如 a++
或 a--
)。前置形式先增加(或减少)值,然后返回新值。后置形式先返回当前值,然后再增加(或减少)值。
6、C++的关系运算符
C++的关系运算符用于比较两个值之间的关系,这些运算符总是返回一个布尔值,即true
(真)或false
(假)。以下是C++中常见的关系运算符:
- 等于(==):检查两个操作数是否相等,如果相等则条件为真。
C++ | |
---|---|
1 2 3 |
|
- 不等于(!=):检查两个操作数是否不相等,如果不相等则条件为真。
C++ | |
---|---|
1 2 3 |
|
- 大于(>):检查左操作数的值是否大于右操作数,如果是则条件为真。
C++ | |
---|---|
1 2 3 |
|
- 小于(<):检查左操作数的值是否小于右操作数,如果是则条件为真。
C++ | |
---|---|
1 2 3 |
|
- 大于或等于(>=):检查左操作数的值是否大于或等于右操作数,如果是则条件为真。
C++ | |
---|---|
1 2 3 |
|
- 小于或等于(<=):检查左操作数的值是否小于或等于右操作数,如果是则条件为真。
C++ | |
---|---|
1 2 3 |
|
这些关系运算符可以用于所有的基本数据类型,包括整数、浮点数、字符等。同时,也可以用于某些复杂的数据类型,例如字符串和自定义的对象(需要重载相应的运算符)。
7、C++的逻辑运算符
C++ 的逻辑运算符用于连接和修改布尔表达式。以下是 C++ 中的逻辑运算符:
- 逻辑 AND(&&):如果两个操作数都是真,则条件变为真。
C++ | |
---|---|
1 2 3 |
|
- 逻辑 OR(||):如果两个操作数中至少有一个是真,则条件变为真。
C++ | |
---|---|
1 2 3 |
|
- 逻辑 NOT(!):用于反转操作数的逻辑状态。如果条件为真,则逻辑 NOT 操作符将使其为假;如果条件为假,则逻辑 NOT 操作符将使其为真。
C++ | |
---|---|
1 2 |
|
需要注意的是,逻辑 AND 和逻辑 OR 操作符在 C++ 中是短路的。这意味着对于逻辑 AND,如果第一个操作数为假,那么第二个操作数就不会被评估,因为整个表达式已经可以确定为假。同理,对于逻辑 OR,如果第一个操作数为真,那么第二个操作数就不会被评估,因为整个表达式已经可以确定为真。
8、C++的位运算符
位运算符在 C++ 中用于对二进制位进行操作。以下是 C++ 中的位运算符:
- 位 AND(&):如果两个相应的二进制位都为1,则结果为1,否则为0。
C++ | |
---|---|
1 2 3 |
|
- 位 OR(|):如果两个相应的二进制位至少有一个为1,则结果为1,否则为0。
C++ | |
---|---|
1 2 3 |
|
- 位 XOR(^):如果两个相应的二进制位中只有一个为1,则结果为1,否则为0。
C++ | |
---|---|
1 2 3 |
|
- 位 NOT(~):对二进制数进行“翻转”操作,即将1变为0,将0变为1。
C++ | |
---|---|
1 2 |
|
- 左移(<<):将二进制位向左移动指定的位数,右侧用0填充。
C++ | |
---|---|
1 2 |
|
- 右移(>>):将二进制位向右移动指定的位数。对于无符号数,左侧用0填充。对于有符号数,左侧用符号位的值填充(这被称为“算术右移”)。
C++ | |
---|---|
1 2 |
|
请注意,位运算符只能用于整数类型(如 int
、char
、long
等)。对于浮点数或对象,这些运算符没有定义。
9、C++的赋值运算符
C++ 的赋值运算符用于将值赋给变量。以下是 C++ 中的赋值运算符:
- 基础赋值运算符(=):将右操作数的值赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 加法赋值运算符(+=):把右操作数加到左操作数上,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 减法赋值运算符(-=):从左操作数中减去右操作数,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 乘法赋值运算符(*=):把右操作数乘以左操作数,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 除法赋值运算符(/=):将左操作数除以右操作数,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 模数赋值运算符(%=):将左操作数除以右操作数,并将余数赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 左移赋值运算符(<<=):将左操作数的二进制位向左移动指定的位数,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 右移赋值运算符(>>=):将左操作数的二进制位向右移动指定的位数,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
- 位 AND 赋值运算符(&=):对左操作数和右操作数进行位 AND 操作,并将结果赋给左操作数。
C++ | |
---|---|
1 2 |
|
-
位 OR 赋值运算符(|=):对左操作数和右操作数进行位 OR 操作,并将结果赋给左操作数。
C++ 1 2
cppCopy codeint a = 5; // in binary: 101 a |= 3; // a is now 7 (in binary: 111)
-
位 XOR 赋值运算符(^=):对左操作数和右操作数进行位 XOR 操作,并将结果赋给左操作数。
C++ 1 2
int a = 5; // in binary: 101 a ^= 3; // a is now 6 (in binary: 110)
这些赋值运算符都有相应的二元运算符,例如 +=
对应 +
,-=
对应 -
,等等。它们将二元运算的结果赋值给左操作数,这可以使代码更简洁。
10、C++常见运算符的优先级
下面是按优先级(从高到低)列出的 C++ 运算符:
优先级 | 运算符 | 描述 |
---|---|---|
1 | :: |
范围解析运算符 |
2 | a++ a-- |
后缀自增、自减 |
2 | ++a --a |
前缀自增、自减 |
2 | +a -a |
一元加和减 |
2 | ! ~ |
逻辑非和位非 |
2 | (type) |
类型转换 |
2 | *a &a |
指针解引用和取地址 |
2 | sizeof |
计算大小 |
2 | new new[] |
动态内存分配 |
2 | delete delete[] |
动态内存释放 |
3 | .* ->* |
成员指针解析 |
4 | * / % |
乘、除、取模 |
5 | + - |
加、减 |
6 | << >> |
左移、右移 |
7 | < <= > >= |
小于、小于等于、大于、大于等于 |
8 | == != |
等于、不等于 |
9 | & |
位与 |
10 | ^ |
位异或 |
11 | | |
|
12 | && |
逻辑与 |
13 | ` | |
14 | ?: |
条件运算符 |
15 | = += -= *= /= %= <<= >>= &= ^= |
= |
16 | , |
逗号运算符 |
注意:这个表格并没有包括所有的 C++ 运算符,但已经包括了最常用的运算符。一些更复杂的运算符,例如函数调用运算符 ()
、数组下标运算符 []
、类型信息运算符 typeid
等,没有包括在内。
11、C++的分支结构
C++ 的分支结构允许根据条件的真假选择执行不同的代码块。以下是 C++ 中的主要分支结构:
- if 语句:
if
语句是最基础的分支结构。如果if
语句的条件为真(即非零),则执行其后的代码块。
C++ | |
---|---|
1 2 3 |
|
- if-else 语句:
if-else
语句允许在if
语句的条件为假时执行另一个代码块。
C++ | |
---|---|
1 2 3 4 5 |
|
- if-else if-else 语句:
if-else if-else
语句允许对多个条件进行检查,按顺序执行第一个为真的条件对应的代码块。
C++ | |
---|---|
1 2 3 4 5 6 7 |
|
- switch 语句:
switch
语句用于基于一个表达式或变量的值在多个选项中选择一个执行。每个选项由一个case
标签表示。还有一个可选的default
标签,如果没有任何case
标签匹配,则执行default
标签后的代码块。
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
在每个 case
代码块的结尾,通常使用 break
语句结束 switch
语句。如果没有 break
,则会发生“贯穿”(fallthrough),即继续执行下一个 case
代码块,直到遇到 break
或 switch
结构结束。
在编写条件时,要注意用正确的比较运算符(==
、!=
、<
、>
、<=
、>=
)和逻辑运算符(&&
、||
、!
)。注意 if
和 switch
中的条件或表达式应该是布尔表达式或可以转换为布尔值的表达式,即结果为 true
或 false
。
12、C++的循环结构
C++的循环结构允许你多次执行一段代码。以下是C++中的主要循环结构:
- for 循环:
for
循环在一个序列上重复一个或多个语句。你可以在循环的开始设置一个初始值,定义一个条件,以及定义一个在每次迭代后执行的操作。
C++ | |
---|---|
1 2 3 |
|
- while 循环:
while
循环在条件为真时重复一个或多个语句。
C++ | |
---|---|
1 2 3 |
|
- do-while 循环:
do-while
循环与while
循环类似,但它至少执行一次代码块,然后再检查条件。
C++ | |
---|---|
1 2 3 |
|
在每种循环中,你可以使用 break
关键字提前退出循环,无论条件是否满足。同样,你可以使用 continue
关键字跳过当前迭代的剩余部分,直接开始下一次迭代。
在编写循环条件时,需要确保你在正确的时机更新了循环变量或者状态,否则可能会导致无限循环。请确保你的循环总是有一个定义明确的退出条件,且该退出条件在循环过程中总能被满足,这样可以避免无限循环的发生。
4.循环嵌套
在 C++ 中,你可以在一个循环内部放置另一个循环,这就是所谓的循环的嵌套。最内层的循环是最先执行的,当最内层的循环的所有迭代都执行完毕后,外层的循环才会进行下一次迭代。下面是一些例子:
- 嵌套的 for 循环:
C++ | |
---|---|
1 2 3 4 5 |
|
- 嵌套的 while 循环:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
- 嵌套的 do-while 循环:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
在这些例子中,我们打印了所有 i 和 j 的组合,这是一个 5x5 的网格。这只是嵌套循环的一个例子,你可以根据需要调整循环的条件和结构。
在使用嵌套循环时,要注意每层循环的条件和计数器。特别是当你在内部循环中改变外部循环的计数器或条件时,你需要格外小心,因为这可能会导致意外的结果或无限循环。
本页面的全部内容在 小熊老师 - 莆田青少年编程俱乐部 0594codes.cn 协议之条款下提供,附加条款亦可能应用