目录
一、C++输出数据
1.1 数据的分类
数据有数字、字符和字符串三种类型。
- 数字:直接书写,如:100、18.52、0、9;
- 字符:用半角的单引号包含的一个符号,如:'A'、'Z'、'0'、'9'、'~'、'+',汉字和全角的标点符号不是字符;
- 字符串:用半角的双引号包含的多个符号,如:"Hello World"、"我是一只傻鸟"、"西施"、"100"、"X"。
1.2 输出数据
- std::cout可以输出各种类型的数据;
- <<操作符可以拼接多个数据项;
- std::endl也可以用于换行;
- using namespace std;指定缺省的命名空间。
不使用std命名空间:
#include <iostream>
int main()
{
// 用多个数据项输出超女信息,姓名:西施;年龄:25;体重:48.5;性别:X
// std::cout << "姓名:西施;年龄:25;体重:48.5;性别:X\n";
std::cout << "姓名:" << "西施" << ";年龄:" << 25 << ";体重:" << 48.5 << ";性别:" << 'X' << std::endl;
}
使用std命名空间:
#include <iostream>
// 指定缺省的命名空间。
using namespace std;
int main()
{
// 用多个数据项输出超女信息,姓名:西施;年龄:25;体重:48.5;性别:X
// std::cout << "姓名:西施;年龄:25;体重:48.5;性别:X\n";
cout << "姓名:" << "西施" << ";年龄:" << 25 << ";体重:" << 48.5 << ";性别:" << 'X' << endl;
}
二、注释
在程序中添加的说明文字,对代码的流程或功能加以解释,方便自己和其他的程序员阅读和理解代码。
编译器在编译源代码的时候,会忽略注释。
2.1 单行注释
用两根反斜线打头,一般放在代码的上方,或者一行语句的末尾。
#include <iostream>
int main()
{
// 用多个数据项输出超女信息,姓名:西施;年龄:25;体重:48.5;性别:X
// std::cout << "姓名:西施;年龄:25;体重:48.5;性别:X\n";
std::cout << "姓名:" << "西施" << ";年龄:" << 25 << ";体重:" << 48.5 << ";性别:" << 'X' << std::endl;
}
2.2 多行注释
从/*开始,到*/结束,把一些内容夹住。
#include <iostream>
int main()
{
/*
测试多行注释
*/
std::cout << "姓名:" << "西施" << ";年龄:" << 25 << ";体重:" << 48.5 << ";性别:" << 'X' << std::endl;
}
2.3 VS中的快捷键
添加注释:Ctrl+k+c
取消注释:Ctrl+k+u
三、变量
3.1 声明变量
变量在使用之前要先声明。
语法:数据类型 变量名
C++常用的数据类型有五种:整数(int)、浮点数(float和double)、字符(char)、字符串(string)和布尔(bool)。
变量在声明的时候可以赋初始值。
语法:数据类型 变量名=值
3.2 变量的赋值
语法:变量名=值
3.3 示例
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
// 整数(int)、浮点数(float和double)、字符(char)、字符串(string)和布尔(bool)。
// 超女基本信息:姓名、年龄、体重、性别、颜值。
// 声明变量,存放超女基本信息的数据项。
string name = "西施"; // 姓名。
int age = 25; // 年龄。
double weight = 48.6; // 体重(kg)。
char sex = 'X'; // 性别:X-女;Y-男。
bool yz = false; // 颜值:true-漂亮;false-不漂亮。
cout << "姓名:" << name << ",年龄:" << age << ",体重:" << weight
<< ",性别:" << sex << ",颜值:" << yz << endl;
name = "冰冰"; // 字符串有双引号包含。
age = 23; // 整数直接书写。
weight = 50.5; // 浮点数直接书写。
sex = 'X'; // 字符用单引号包含。
yz = true; // 布尔型取值只能是true和false,或1和0。
cout << "姓名:" << name << ",年龄:" << age << ",体重:" << weight
<< ",性别:" << sex << ",颜值:" << yz << endl;
}
四、常量
常量是程序中固定不变的数据。
4.1 宏常量
一般在main函数的上面声明,用大写命名。
语法:#define 常量名 值
注意:宏常量也可以用在main函数中,只不过一般不会这么用。
4.2 const修饰的变量
在程序的任何地方都可以声明。
语法:const 数据类型 常量名=值
4.3 示例
#include <iostream> // 包含头文件。
#define MONTHS 12 // 一年中的月份数。
#define PI 3.14159 // 圆周率。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
const int days = 7; // 一个星期中的天数。
cout << "一年有" << MONTHS << "个月。" << endl;
cout << "圆周率的值是:" << PI << endl;
cout << "一个星期有" << days << "天。\n";
}
五、标识符的命名
5.1 C++命名规则
C++规定给标识符(变量、常量、函数、结构体、类等)命名时,必须遵守以下规则。
- 在名称中只能使用字母字符、数字和下划线;
- 名称的第一个字符不能是数字;
- 名称区分大写字符与小写字符;
- 不能将C++关键字用作名称;
- 以下划线和大写字母打头的名称被保留给编译器及其使用的资源使用,如果违反了这一规则,会导致行为的不确定性。
- C++对名称的长度没有限制,但有些平台可能有长度限制(64字符)。
C++提倡有一定含义的名称(望名知义)。
5.2 C++关键字
每个C++关键字都有特殊的含义,用于声明类型、对象、函数、命名空间等,程序中不能声明与关键字同名的标识符。
asm | do | if | return | typedef |
auto | double | inline | short | typeid |
bool | dynamic_cast | int | signed | typename |
break | else | long | sizeof | union |
case | enum | mutable | static | unsigned |
catch | explicit | namespace | static_cast | using |
char | export | new | struct | virtual |
class | extern | operator | switch | void |
const | false | private | template | volatile |
const_cast | float | protected | this | wchar_t |
continue | for | public | throw | while |
default | friend | register | true | |
delete | goto | reinterpret_cast | try |
六、数据输入
6.1 用std::cin输入数据
语法:std::cin>>变量名;
注意:
- a)布尔型变量的值在计算机内部用1(true)和0(false)存储;b)程序中可以书写true和false,也可以书写1和0,其它值将强制转换成1;c)用cin输入时可以填1和0,其它值也强制转换成1;d)用cout输出时只显示1和0,不显示true和false。
- 如果输入的数据与变量的数据类型不匹配,会导致行为的不确定性。
6.2 示例
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
string name; // 姓名。
cout << "请输入超女的姓名:";
cin >> name;
cout << "输入的超女姓名是:" << name << endl;
int age; // 年龄。
cout << "请输入超女的年龄:";
cin >> age;
cout << "输入的超女年龄是:" << age << endl;
double weight; // 体重(kg)。
cout << "请输入超女的体重(kg):";
cin >> weight;
cout << "输入的超女体重是:" << weight << endl;
char sex; // 性别:X-女;Y-男。
cout << "请输入超女的性别(X-女;Y-男):";
cin >> sex;
cout << "输入的超女性别是:" << sex << endl;
bool yz; // 颜值:true-漂亮;false-不漂亮。
cout << "请问输入超女的颜值(1-漂亮;0-不漂亮):";
cin >> yz;
cout << "输入的超女颜值是:" << yz << endl;
}
七、算术运算
7.1 运算符
运算符 | 描述 |
+ | 两个数相加。 |
- | 一个数减另一个数。 |
* | 两个数相乘。 |
/ | 分子除以分母。 |
% | 取模运算,整除后的余数。 |
注意:
- 整数进行除法运算时,如果分母为0,程序将异常退出;
- 浮点数进行除法运算时,如果分母为0.0,将得到inf(infinite,无穷大);
- 两个整数进行除法运算时,将舍去小数部分,得到一个整数;
- 整数与浮点数进行除法运算时,得到的结果是浮点数;
- 进行除法运算时,在整数前面加(float)或(double)可以将整数转换为float或double类型;
- 取模运算只能用于整数(分母也不能为0)。
7.2 自增与自减
运算符 | 描述 |
++变量名 | 先把变量的值加1,然后再执行表达式。 |
变量名++ | 先执行表达式,再把变量的值加1。 |
--变量名 | 先把变量的值减1,然后再执行表达式。 |
变量名-- | 先执行表达式,再把变量的减1。 |
7.3 赋值运算符
运算符 | 示例 | 描述 |
= | c = a + b; 将把a + b的值赋给c。 | 把右边操作数的值赋给左边操作数。 |
+= | c += a; 相当于 c = c + a; | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数。 |
-= | c -= a; 相当于 c = c - a; | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数。 |
*= | c *= a; 相当于 c = c * a; | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数。 |
/= | c /= a; 相当于 c = c / a; | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数。 |
%= | c %= a; 相当于 c = c % a; | 求余数且赋值运算符,求两个操作数的模赋值给左边操作数,浮点数不适用取余数。 |
注意:
- 字符串(string)只能使用等号(=)赋值,不能使用其它的赋值运算符;
- 浮点数不能使用%=运算符;
- 等号(=)赋值运算符可以连续使用;
- 如果赋值运算符两边操作数的数据类型不同,C++将自动转换数据类型,可能会损失精度,也可能超出取值范围,如果转换不成功,编译时会报错。
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
int a = 10;
int c = 20;
// c += a; // c=c+a;
// c -= a; // c=c-a;
// c *= a; // c = c * a;
// c /= a; // c = c / a;
//c %= a; // c = c % a;
// cout << "c=" << c << endl;
a = c = 30; // 连续赋值
cout << "a=" << a<<endl;
cout << "c=" << c << endl;
}
7.4 C++ 11初始化赋值
- 把值写在小括号中,等于号可以省略(C++标准)
int a=(15); // 声明变量a,初始化值为15。
int b(20); // 声明变量b,初始化值为20。
- 把值写在花括号中,等于号也可以省略(C++11标准),统一初始化列表。
int a={15}; // 声明变量a,初始化值为15。
int b{20}; // 声明变量b,初始化值为20。
注意:在Linux平台下,编译需要加-std=c++11参数。
7.5 关系运算符
关系运算
用于比较两个表达式的值,运算的结果为1-true和0-false。
关系 | 数学的表示 | C++的表示 |
等于 | = | == |
不等于 | ≠ | != |
小于 | < | < |
小于等于 | ≤ | <= |
大于 | > | > |
大于等于 | ≥ | >= |
注意:
- 关系运算符的两边可以是数值,也可以是表达式;
- 用std::cout输出关系运算表达式时,关系表达式要加括号;
- 关系运算也适用于字符串(string),字符串常用的关系运算是==和!=,其它的基本上不用。
示例
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
int a = 7;
int b = 7;
bool result;
result = a <= b - 3; // a和b先做比较(关系)运算,然后再赋值给result。
cout << "result=" << result << endl; // 关系运算表达式需要括号,算术运算表达式可以不用括号。
string str1 = "西施";
string str2 = "西瓜";
cout << (str1 == str2) << endl;
}
7.6 逻辑运算符
逻辑运算
根据给定的逻辑因子(表达式或值)返回一个新的逻辑因子。
运算符 | 术语 | 示例 | 结果 |
&& | 逻辑与 | a&&b; | 如果a和b都为真,则结果为真,否则为假。 |
|| | 逻辑或 | a||b; | 如果a和b中有一个为真,则结果为真,二者都为假时,结果为假。 |
! | 逻辑非(反) | !a; | 如果a为假,则!a为真; 如果a为真,则!a为假。 |
注意:
- 逻辑运算符的两边可以是数值,也可以是表达式;
- 用std::cout输出逻辑运算表达式时,逻辑表达式要加括号;
- 在实际开发中,逻辑运算的多重组合是重点。
示例
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
// main函数,程序从这里开始执行,每个程序只能有一个main函数。
int main()
{
bool a = false;
bool b = true;
// bool c = a && b; // 如果a和b都为真,则结果为真,否则为假。
// bool c = a || b; // 如果a和b中有一个为真,则结果为真,二者都为假时,结果为假。
bool c = !a; // 如果a为假,则!a为真; 如果a为真,则!a为假。
// cout << "c=" << c << endl;
// cout << "a&&b=" << (a && b) << endl;
// cout << "a||b=" << (a || b) << endl;
cout << "!a=" << c << endl;
}
7.7 运算的优先级
一个表达式可以包含多个运算符,运算符的优先级决定了表达式各部分的执行顺序。
例如,按照运算规则, *的优先级比+高,所以的b * c将先执行:
a + b * c;
如果想让a + b先执行,则必须使用括号:
(a + b) * c;
如果一个表达式中操作符的优先级相同,那么它们的结合律(associativity)决定了它们的执行顺序(从左到右或从右到左)。例如,算术运算的组合方式是从左到右,赋值运算则是从右到左。如下:
表达式 | 结合律 | 组合方式 |
a/b%c | 从左到右 | (a/b)%c |
a=b=c | 从右到左 | a=(b=c) |
下表是全部运算符的优先级和结合律:
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 |
1 | [] | 下标 | 地址[表达式] | 左到右 |
() | 圆括号 | (表达式)/函数名(形参表) | ||
. | 成员选择(对象) | 对象.成员名 | ||
-> | 成员选择(指针) | 对象指针->成员名 | ||
2 | - | 负号运算符 | -表达式 | 右到左 |
(类型) | 强制类型转换 | (数据类型)表达式 | ||
++ | 前置自增运算符 | ++变量名 | ||
++ | 后置自增运算符 | 变量名++ | ||
-- | 前置自减运算符 | --变量名 | ||
-- | 后置自减运算符 | 变量名-- | ||
* | 取值运算符 | *指针变量 | ||
& | 取地址运算符 | &变量名 | ||
! | 逻辑非运算符 | !表达式 | ||
~ | 按位取反运算符 | ~表达式 | ||
sizeof | 长度运算符 | sizeof(表达式) | ||
3 | / | 除 | 表达式/表达式 | 左到右 |
* | 乘 | 表达式*表达式 | ||
% | 余数(取模) | 整型表达式/整型表达式 | ||
4 | + | 加 | 表达式+表达式 | 左到右 |
- | 减 | 表达式-表达式 | ||
5 | << | 左移 | 变量 | 左到右 |
>> | 右移 | 变量>>表达式 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 |
>= | 大于等于 | 表达式>=表达式 | ||
< | 小于 | 表达式 | ||
<= | 小于等于 | 表达式 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 |
!= | 不等于 | 表达式!= 表达式 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 |
10 | | | 按位或 | 表达式|表达式 | 左到右 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 |
/= | 除后赋值 | 变量/=表达式 | ||
*= | 乘后赋值 | 变量*=表达式 | ||
%= | 取模后赋值 | 变量%=表达式 | ||
+= | 加后赋值 | 变量+=表达式 | ||
-= | 减后赋值 | 变量-=表达式 | ||
<<= | 左移后赋值 | 变量 | ||
>>= | 右移后赋值 | 变量>>=表达式 | ||
&= | 按位与后赋值 | 变量&=表达式 | ||
^= | 按位异或后赋值 | 变量^=表达式 | ||
|= | 按位或后赋值 | 变量|=表达式 | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 |
注意:
- 如果不确定运算符的优先级,可以加括号;
- 多用括号,让代码的可读性更好。