当前课程知识点:基于Linux的C++ > 第一讲 C/C++基本语法元素 > 1.5 基本语法元素 > LinuxCPP0105
接下来是C/C++的基本语法元素
我们先从两个简单的数据类型开始讲起
一个是整数类型 一个是浮点数
我们前面其实有了经验
使用int来表示一个整数类型的数据对象
表达的时候 同学们要特别记得
它不是数学上的整数
它是有一个取值范围的
因为计算机的内存宽度是有限的
它所能够表达整数的范围是有限的
它只能表示特定区域内的一个整数值
这是一个 然后第二个是浮点数
它提供两个主要的(数据类型)
一个叫double一个叫float来表示一个小数
它同样都有一个特定的取值范围
那么两者有什么差别呢
double和float
就是一个精度高一点 一个精度低一点
float精度低一点 double精度高一点
首选double 精度很高
平时尽量不要用float
因为float的有效位数只有六位和七位
精度不够高
回到我们刚才的整数数据类型
我定义a是一个整数
我们前面举例子也看到“int a;”
就定义a是一个整数
这就是变量a的定义语句
定义一个整数过程中
我还能够决定这个整数取值范围
它包括不包括负数
就是确定它是有符号的
还是无符号的
用signed int来表示
这样一个数是有符号的
unsigned int是无符号的
表达一个无符号整数意味着什么呢
没有负号了
那就只能表达从0到某个最大正整数
这样一个取值范围
(关于)整数类的长短
还有两个关键词
一个叫long 一个叫short
来表达整数的长短
有的时候我们需要的整数
不需要表达这么宽
现在很多主流的计算机
都是64位的CPU
宽度都是64位宽的
但是我们现在使用的主流编译器
它实际上都是32位的
包括我们现在用到的一些应用程序
还仍然保留在32位
为什么 因为对一个普通应用来讲
32位的程序是够用的
其实也就将将够 所以迁徙到64位
相对于它的难度来讲大家的兴趣不大
现在主流C++编译器仍然是32位
int基本上都是32位的
32位能表达多少数呢
能够表达从-21个亿到+21个亿这样的数据
数据蛮大的吧
如果是一个unsgined int
那就是从0到42个亿这样的数据范围
我们平时要表达一些特定数据量的话
有的时候不需要这么大数字
这时候我们可以
把这个整数再弄短一点
前面加一个short 就短了
short int短多少呢 看一个编译器
有的16位 有的8位
16位有多大呢 就是0到655535
或者-32768 到32767
像这样数字基本就够了
你要知道彭祖当年号称800岁
你看看 这个表达范围就够了
我们正常人哪能活那么长呢
还有一个long int
要把它搞长一点 那更没用
在主流编译器下面long int就是int
那你说我现在不都是64位计算嘛
64位操作系统 那我要64位的整数
用int能表达吗 不能
有的编译器支持long long int
那就整数万岁了 对吧
后来呢有一个不成熟的关键字
就叫__int64
就用它来表达64位整数
现在因为不同编译器
在这个问题上面还没有完全统一
理论来讲这两种格式
好像象都应该可以处理
接下来我们看量与表达式
这里面涉及到几个主要的问题
第一个表达式
第二个变量的概念
然后文字和常量
然后怎么进行赋值与初始化
我们先从表达式定义开始讲起
什么叫表达式
表达式就是操作数和操作符序列
表达运算过程
操作数在这里面包括文字 量 函数调用
还包括括号
这些都可以作为操作数
因为括号讲起来相当于
另外一个子表达式
它把这个子表达式做完
把这个结果放到这个位置
剩下操作符
操作符就是我们运算的逻辑
所以函数调用 括号
其实可以认为是一个操作符
但是它的结果其实充当操作数
表达式求值就是运算
得到结果 就这样一个过程
计算肯定离不开量 尤其是变量
什么叫变量呢
变量就是在整个程序运行期间
它存储的值可以改变的量
在C/C++这种程序设计语言里面
变量必须先定义再使用
变量的名字要求在语言中具有唯一性
不允许重名
我们总结出来变量有四个基本特征
我把四个首字母抽取出来
拼成一个单词 叫VANT vantage词根
四个基本特征
变量具有值
变量总是和内存中的地址相对应的
我们可能很多时候不知道那个地址
具体是在什么位置 编号是多少
但是它肯定是有的
这是第二个
第三个变量总是要有一个名字name
总是具名的
无名英雄 一般是不允许的
还有每一个变量都具有特定的型
每个数据对象类型必须匹配
否则的话没有办法去运算
文字和变量不一样
文字是指程序中单独出现的值
比如圆周率3.14 这种东西
直接出现就这么一个数据值
那我们就称它为文字
也有的时候它不仅仅是数字
它也可能是字符串
它也是文字
整数类型的文字
十进制表示
十六进制 八进制表示都可以
如果是一个标准十进制表示
那就是普通整数
你该怎么写就怎么写
如果十六进制它就不一样了
逢十六进一
它就从0到9这个数字不够
还要abcdef来表示
所以要表示十六进制的话
就前面用0x来开头
x大写小写都可以
所以十六进制的0X55就表示十进制的85
八进制的话 就是逢8进1
刚才是逢16进1 这是逢8进1了
前面加一个0
0后面不用x
注意8进制不能和10进度相混淆
逢8进1 不是逢10进1
8进制平时我们很少用
16进制倒是蛮常用的
最常用当然是整数
标准整数 10进制
如果是浮点数的话
同样是有两种表示方式
一种是一般形式
就是小数表示法
指数形式的 比如小数π 圆周率3.1416
这就是我们的小数
第二是科学计数法
用字符E(大小写都可以)来表达
前面是尾数部分 后面跟着一个e
就表示对应的指数部分开始
3.14e3写的是什么
就是3.14乘上10的三次方
-2.7e-2 写的是什么
是-2.7乘上10的-2次方
这就是科学计算法
字符串文字
是双引号引起来的字符序列
“Programming in C++”
就是字符串
还有“Hello World!\n”
这也是字符串
双引号引起来的
像这样字符串类型的文字
里面有可能出现一系列的转义序列
用‘\n’来表示一个换行
因为字符串里面
有一些不可打印字符
往往表示控制信息
那么我们怎么把它显示出来
(就需要)使用转义序列
这个转义序列表达的时候
由‘\’开头 后面跟着特定的
一个或者多个字符来表示
这就是转义字符序列
我们列了一个表格
是C/C++语言给我们预定好的
‘\n’是换行
‘\0’表示对应的ASCII值为0
‘\”’表示双引号字符
‘\\’ 表示反斜杠自身
接下来第三个概念就是常量
常量是什么呢
从定义上来讲
常量就是程序在运行期间
它的值不可以改变的量
我们就称它为常量
定义和变量就不一样
第一 我前面加上一个const
表示它是一个常量
后边要有一个等号
跟着一个初始值
注意啊 那其实不是等号
当然它也不是赋值号
它就是初始化符号
因为一个常量在定义好了以后
它的值在整个程序运行期间
是不能变的
所以绝不可以对这个常量进行赋值
任何时候对它进行赋值都是错的
那怎么给它设定一个有意义的值
给它设值的唯一场合
就是在定义这个常量的瞬间
也就是对它进行初始化
const int zero
把它初始化成0
常量有什么意义呢
它最重要的一个意义
是解决我们程序中出现的一些魔数
就是那个文字
孤零零出现一个 比如3.14
你说3.14是什么
在我程序中出现一个东西
它到底是什么
谁告诉你一定是圆周率
你回家量量你那房子
房子内部宽度
难道不可能刚好是3.14吗
所以你说这个东西它有什么意义呢
它充当一个魔数
没有办法解释它的意义
你一旦把一个长度
把一个房子的宽度变成了圆周率
那参与数学运算的结果肯定崩掉
肯定不对了嘛
所以我们得弄一个常数
凡是出现圆周率的地方
我写const double pi = 3.14
现在好了吧
房子那个宽度3.14刚好跟它巧合了
那巧合归巧合
它们是两个不同的量
一个是常量 一个是变量
两者没关系了
我后面写程序也不会混淆啊
所以这个常量作用就在这里
体现出来了吧 取代魔数
常量和变量是不一样的
常量不可以在运营期间改变它的值
其它呢和变量性质都一样
定义常量的时候必须对它进行初始化
初始化那个表达式
必须在编译期间
就能够算出结果来
这是明确的要求
接下来就是赋值
我们前面其实已经见到过赋值表达式
标准变量名称后面跟着一个表达式
运算出结果
把这个结果传给变量名称
这是一个标准表达式 a = 0
后面加一分号就变成了赋值语句
变量在定义的时候
当然也可以对它进行初始化
比如int a = 0 这是没问题的
但是变量和常量不一样的
你哪怕真的初始化成0
后续也可以不断对它进行赋值
比如 a后来又赋值为1
后来又赋值为2 这是没问题的
初始化在它定义瞬间的只能做一次
而变量的赋值可以随便做
想做几次就做几次
我们可以看简单的赋值流程
回到我们刚才那个图
我有三个量a、b、sum三个量
我都画了一个框框来表达它们
现在我在a、b、sum三个量外面
再封包一个框
然后在上面贴一个标签main
表示这三个量属于main函数
这个我们后面就会有一个
关键的专业名词称呼它
它叫函数调用的栈框架
我们现在来看程序赋值流程
一旦我们将一个整型数字1赋值给a
a里面将会具有整数1
完成b的赋值
b里将会有个数2
完成sum的赋值
sum里面将会有3
在C++代码中有三种类型的操作符
一种叫一元操作符
一种叫二元操作符
一种叫三元操作符
有的操作符带一个操作数就够了
比如加负号 有个变量a
然后-a就取它对应的负值
这就是一元操作符
还有二元操作符
有两个操作数
a + b 加号有两操作数
在C/C++里面
操作符有优先级
决定整个表达式的计算顺序
结合性呢 决定计算的方向
你看左结合 右结合的
从左到右算 从右到左算
但C/C++的操作符优先级
和结合性它很特殊
特殊在什么地方
C/C++里面操作符特别多 特别复杂
它那个操作符优先级
分成了十好几级 特别复杂
有些操作符用的时候
不是特别小心的话
一弄就搞错了
所以用起来特别复杂 费劲
同学们在理解它的时候需要特别
你写一个表达式
你想先算哪个 想后算哪个
你搞不清楚它优先级就加括号
编译器会自动将不需要的括号去除
这一点你不用担心
不会影响我们的程序效率
接下来就是语句
在我们C/C++代码里面包括了三种
一种简单语句 一种是复合语句
还有空语句
第一个 简单语句
就是一个表达式后面跟着一个分号
它就叫简单语句
你别管这个表达式有多复杂
它都是一条简单语句
第二 复合语句
复合语句是什么
就是花括号对括起来的一个语句序列
剩下就是空语句 什么内容都没有
就是一个孤零零一个分号
我需要一个分号在这个地方
它有两种用途
第一个 满足特定的程序语法规则
有的时候语法规则
要求这个地方必须有一条语句
可是又没有语句往里填
填什么 填这个分号 空语句
在开发程序的过程中
我现在也不知道程序写出来对不对
我想测试一下
可是这段代码我不知道该写什么
怎么办
我就先写一个分号(空语句)放在这个地方
表示这个地方我知道我未来还要填代码
但现在我不知道该填什么
先运行一下
看看我们原型系统能不能够运行
有没有问题 这就是占位
这是我们程序开发的一个小技巧
接下来就是我们基本输入输出的功能
基本输入输出我们前面有两个例子
来讨论这个问题
cout做输出 cin做输入
输出的话我们称之为插入操作符
为什么
是要把这个数据插入到这个输出流里
所以叫插入操作符
cout << “Hello World!” << endl
把“Hello World!”这个字符串
插到这个输出流里了
后来又把这个换行(endl标志)
插入这个输出流里
输入的话就是cin
从这个输入流里面
把这个数据提取出来
比如cin >> a
它也可以连写 >> b按照这个方式连写
这是没有问题的
只不过这种方式不太妥当
因为你没有提示信息
用户不知道 输入两个整数
这就是标准的基本输入输出工作
它实际上是很简单的
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口