Skip to content

初识 C++

C++源程序框架

cpp
#include<iostream>
#include<cstdio>        // 必须的两行,使用I/O头文件
using namespace std;    // 使用std命名空间

int main() {            // 主程序 花括号括起来的是为函数体
    cout << "Hello, C++" << endl;    // C++方式输出
    printf("%s\n", "Hello, C++");      // C方式输出

    return 0;           // 返回值
}

执行流程

将上述代码保存为xxx.cpp文件后:

  1. 编译(F9)-->运行(F10)

  2. 或者是编译运行(F11)

代码分析

  1. 头文件
  2. 命名空间
  3. 主函数
  4. 函数体
  5. 函数返回值
  6. 语句

常量和变量

常量

程序运行过程中,其值保持不变(即不能被改变)的量。主要分成四类:

  1. 整型常量

    1. 二进制:0001、1010
    2. 八进制:数字 0开头,如012或写成12(8),每位取值范围[0, 7]。
    3. 十进制
    4. 十六进制:以0x0X开头,如0x1a或写成1a(16),每位取值范围[0, f]。
  2. 实型常量

    1. 小数:如31.41.23
    2. 科学计数法:如1e23.14e-1
  3. 字符常量

    单引号表示单个字符,如'k''5'' ''%'等。注意:双引号引起来的是字符串

  4. 符号常量

    const 符号常量 = 常量字串

    如:

    cpp
    const double PI = 3.1415926; // 符号常量一般使用大写表示

变量

在程序运行过程中其值可以改变。变量在内存中占据一定的存储单元。

  1. 变量的三个属性:变量名、变量值、存储单元

  2. 变量名是一种标识符,函数名、数组名、文件名等都是标识符,标识符的命名规则如下:

    1. 由字母、数字、下划线构成
    2. 不能以数字开头
    3. 不能与系统关键字冲突

    一点建议:变量命名要见名知意

    练习:下列变量名不合法,为什么?

    M.D.John, $123, #23, 3G64, ling ling, C++, zhang-ling, U.S.A
  3. 变量的使用

    1. 先定义后使用
    2. 先赋值后使用
  4. 变量的定义

    格式:数据类型 变量名表,例如:

    cpp
    int a;       // 整型变量a
    double b, c; // 双精度浮点型变量b, c
    char e;      // 字符型变量e
    
    int x = 10   // C++允许在变量定义的同时进行赋值
    x = 11
    x = 12       // 变量值允许被覆盖,即同一个变量被多次赋值,变量值为最后一次赋值的值。此时x的值为12。
  5. 由变量定义的格式可知,变量是有类型的,C++在编译时会根据不同的数据类型,自动为变量分配存储单元。

数据类型

C++中的数据类型整体被分成:基本类型构造类型指针类型以及引用类型。在语言基础部分我们先学习四大基本类型。

类型关键字
整型int
浮点型单精度(float),双精度(double)
字符型char
布尔型bool

这些基本类型可以使用一个或多个类型修饰符进行修饰

  • signed
  • unsigned
  • short
  • long
类型范围
char1 byte-128 到 127 或者 0 到 255
unsigned char1 byte0 到 255
[signed] short [int]2 byte-32768 到 32767
unsigned short [int]2 byte0 到 65535
[signed] [long] int4 byte-2147483648 到 2147483647
unsigned int4 byte0 到 4294967295
[signed] long long [int]8 byte-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long long [int]8 byte0 到 18,446,744,073,709,551,615
float4 byte单精度型占 4byte(32 位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double8 byte双精度型占 8 byte(64 位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double16 byte长双精度型 16 byte(128 位)内存空间,可提供 18-19 位有效数字。

整型

位与字节

计算机中的数据是以二进制(01)来存储的,每一个二进制位被称作一位或是 1bit8bit 又被称作 1byte(字节),byte 可简写为B,即是: 8bit=1byte

字节是计算机数据存储的最基本单位,常见如下换算:

1B=8b1KB=210B1MB=210KB=220B1GB=210MB=220KB=230B1TB=210GB=220MB=230KB=240B

210=1024,在实际进行换算时也可以将 1024 约看作 1000

问题:1byte 的取值范围是多大呢?

从我们熟悉的十进制看 8 位十进制的取值范围是[000000000, 999999999,那如果是 8 位二进制呢?它的取值范围是?[00000000, 11111111]

问题是11111111是多大呢?

考虑十进制的 5432,它可以写成:2100+3101+4102+5103

这种方法我们称之为按位权展开求值,这也是任意进制转换为十进制的方法。

十进制转换为任意进制呢?请同学们课下探索。

同样的道理11111111按位权 2 展开(120+121+122+123+124+125+126+127)之后得到十进制下的 255(281),故 1byte 的取值范围是[0, 255]

由上面的推导可知:

字节数取值范围
1[0,281]
2[0,2161]
4[0,2321]
8[0,2641]

问题:计算机中的负数是如何表示的?

计算机中是没有+-的,计算机在二进制的最高位使用 0 表示正数,使用 1 表示负数。在有符号表示中由于最高位被占用所以 8 位二进制的取值变成了[(271),271]

计算机中的数据表示方式,请同学们课后探索

C++中的整型

类型范围
[signed] short [int]2 byte-32768 到 32767
unsigned short [int]2 byte0 到 65535
[signed] [long] int4 byte-2147483648 到 2147483647
unsigned int4 byte0 到 4294967295
[signed] long long [int]8 byte-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long long [int]8 byte0 到 18,446,744,073,709,551,615

浮点型

浮点型分成单精度浮点型(float)和双精度浮点型(double),它其实就是数学中的小数,只是区分了不同的精度。注意:浮点型也可以存储整数。

float a = 3.14;
double b = 9.99;
float c = 7;
类型范围有效位
float4 byte-3.4e-38 ~ 3.4e386 ~ 7
double8 byte-1.7e-308 ~ 1.7e30815 ~ 16

字符型

cpp
char c = 'm' // 将字符m赋值给字符变量c

计算机是使用字符编码来表示字符的,C++支持 ASCII(美国信息交换标准代码)。 一个 ASCII 字符占 8bit 也就是 1byte,故它能表示至多 256 个字符,0~127 为基本字符,128~255 为扩展字符,有些字符是非打印字符,作控制用,输出时也不显示,如\a

字符的两种表示方式

  1. 普通表示法:单引号是字符,双引号是字符串
  2. 转义字符:单引号引注,以反斜杠开头,如\a\t\n

布尔型

布尔型只有 true(逻辑真)和 false(逻辑假)两个值,占一个字节,在 C++中所有非 0 值都是 true,只有 0 表示 false,一般我们使用 1 来表示 true。

类型转换

隐式转换

如果类型不匹配时,C++默认会进行类型之间的转换,转换的规则:短类型转长类型

显式转换

将某一个数据类型强制转换为另外一个类型,形式:(类型名) (表达式)

如:

cpp
(int) 4.5; // 4
(double) 4; // 4.00000

了解输入输出语句

cout 和 cin

cout 基本语句格式:cout << 表达式1 << 表达式2 << ... << 表达式n;

cin 基本语句格式:cin >> 变量1 >> 变量2 >> ... >> 变量n;

示例:

cpp
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
    int x;
    float y;
    cout << "Please input an int number:" << endl;
    cin >> x;
    cout << "The int number is x = " << x << endl;
    cout<< "Please input a float number:" << endl;
    cin >> y;
    cout << "The float number is y = " << y <<endl;

    return 0;
}

运行结果:

换行符:endl 和\n

  1. endl:全称为std::endl,其中的lline的意思。
  2. \n :转义字符,表示换行。

运算符和表达式

表达式 = 运算符 + 数据

C++中的运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符,并提供了以下类型的运算符:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符
  6. 杂项运算符

算术运算符

cpp
int a = 10, b = 10;
运算符描述实例
+把两个操作数相加A + B 将得到 30
-从第一个操作数中减去第二个操作数A - B 将得到 0
*把两个操作数相乘A * B 将得到 100
/分子除以分母B / A 将得到 1
%取模运算符,整除后的余数B % A 将得到 0
++自增运算符,整数值增加 1A++ 将得到 11
--自减运算符,整数值减少 1A-- 将得到 9

注意

  1. a / b:如果 a,b 均为整型则是整除,结果向 0 靠近,有一个是浮点型,则这是实除,结果为浮点型。

  2. 自增和自减运算符

    前缀形式:++x --x,先给 x 加或减 1,再使用 x 的值

    后缀形式:x++ x--,先使用 x 的值,再给 x 加或减 1

关系运算符

后面讲

逻辑运算符

后面讲

位运算符

后面讲

赋值运算符

其余的后面讲

赋值运算符:=,或是复合赋值运算符如:+= -= *= /= <<= >>= &= != 等等

杂项运算符

其余的后面讲

  1. 逗号运算符

    逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。

    cpp
    a = (3, 4, 5); // a = 5
    a = (3 + 4, 4 + 5, 9 + 7); // a = 16
  2. sizeof 运算符

    求出变量占多少字节

    cpp
    int a;
    cout << sizeof(a) << endl; // 4

运算符之间的优先级

结合性:即运算符和哪个表达式结合在一起

优先级:

注意:优先级值越大,表示优先级越高。

提示: 如果优先级和结合性掌握不牢靠,可多使用()。


补充:常用库函数<cmath>

函数功能实例
abs(x)返回整型的绝对值abs(-5)5
fabs(x)返回浮点型的绝对值abs(-5.5)5.5
exp(x)返回exexp(1)2.718
floor(x)返回不大于 x 的最大整数floor(-3.14)-4
ceil(x)返回不小于 x 的最小整数ceil(-3.14)-3
log(x)返回lnxlog(1)0
pow(x, y)返回xypow(2, 3)8
rand(x)返回 0 ~ RAND_MAX 之间的随机整数
sqrt(x)返回 x 的平方根sqrt(4)2