C++数据类型与语句

Part Ⅱ 数据类型和语句

基本数据类型

数值型和字符型数据的字节数与数据范围

注意

  • char是一个字符,不支持汉字
  • long,long long,long double 有多长没有明确定义,由编译器决定
  • long不短于int,int不短于short
  • 需要明确自己使用的编译器的基本数据类型的长度

sizeof() 运算符

用法:

  • sizeof(类型)
  • sizeof(变量)
    返回值:数据类型或者变量的字节长度

常量与变量

常量:程序运行过程中,其值一直不变的量
整数常量

  • 十进制 30
  • 八进制 030(24)
  • 十六进制 0x30 (48)
  • 后缀 30l 30L 30ul
    实数常量
  • 十进制 30.5
  • 指数形式 23E2 23e2

编译器根据表面形式(字面值,literal value)来判断常量类型

字符常量
使用一个字节来存储一个字符 `a`
也可以通过单引号括起来的转义字符表示该字符 '\x30 \060'
每个字符对应一个ASCII码 可以通过单引号括起来的转义符表示该字符
需要记住的字符的ASCII码值

字符 ASCII码值
0 48
空格 32
A 65
a 97
使用wchar_t 宽字符,常量L加前缀 L‘汉’ 可以表示汉字

有些控制字符(回车、换行、分页、 缩进)必须要通过转义符表示

字符串常量
用""界定
对于标准C,标准类库没有string,字符串在内存中以字符数组存放,以'\0'结束
所以 "a"在内存中占两个字节 a '\0' 'a'是一个字符
cpp中的String对象,数据如何组织开发人员不知道

变量命名-标识符

标识符:给变量,数组,函数起名,通过名字访问
语法规则

  • 以大小写字母,下划线,$开头
  • 后续可以有大小写字母,下划线,$和数字0-9组成
  • 大小写敏感
  • 不能是C++关键字或操作符

可读性

  • 全局变量见字知意,名字不要果断,局部变量,循环控制 i,j,k
  • 命名风格统一
    • 匈牙利命名法
    • 驼峰命名法

基本数据类型

变量
一个数值内存空间,可以通过名字读写其中的值
在C/C++中,变量需要严格遵循定义(分配),赋值,使用,回收的次序
编译器的动作:

  • 定义:类型 名字
    • 根据类型,分配内存空间,将名字关联内存空间,将来可以通过名字访问该空间
  • 赋值:对内存空间初始化
  • 使用:获取,或者改变内存空间的数值
  • 回收:需要理解变量的回收机制

变量有一定的生存周期与作用范围

变量定义--auto
auto类型的变量,编译器会自动推断类型变量
配合泛型

常变量
C++使用const 定义 常变量
常变量本质是变量,有名字的内存空间,但约束数值在程序运行生命周期不能改变

  • constexpr 编译时常量 类似#define

运算表达式

运算符

  • 自增自减运算符

关系表达式与真假值

C++中,字符、bool转换为整数参与算数运算

  • 非零为真,0为假
  • 关系表达式的结果以及布尔变量的值有两个 1为真,0为假
  • 布尔变量与布尔常量都占一个字节

混合表达式

优先级
分析混合表达式,从左向右看:

  • 先算优先级高的
  • 优先级相同,看结合方向
    • 括号、双目运算符、逗号运算符从左到右计算
    • 单目运算符、三目运算符、赋值从右到左
  • 小括号优先级最高,可以用小括号改变(明确)优先级

优先级:括号>单目>双目>三目>赋值>逗号

逗号运算符与逗号表达式
表达式1,表达式2,表达式3,...,表达式n
整个表达式从左向右求解,结果为最后一个表达式的值
逗号表达式 优先级最低
作用:

  • 变量定义赋值 int a=3,b=4;
  • 某些语法限定 for(int i=0,j=2;i<100;i++,j++)

编译优化

  • 使用逻辑与或逻辑或,会产生短路,是否执行优化,可能影响运行结果
  • 局部规约,非全局规约 a+b+c*d 先算a+b 再算c*d

++的进一步说明
规则1:
++a可以作为左值,a++不行1
规则2:
从左到右解析,同级从右到左计算
规则3:
后加(a++)优先级高,先加(++a)与单目加(+a)同级

混合运算
运算时,根据当前处理的运算符,决定运算数转换的类型
转换会根据原有数据生成临时数据参与运算,原有数据不变

数据类型转化(运算)可能会导致两类问题:

  • 溢出
  • 精度损失

类型转换
C++的类型转换语法不像Java那样严格,需要开发者自己保证转换安全

  • 有符号转无符号,需要开发者保证有符号数是正数
  • 无符号数转有符号数,需要开发者保证不越界
  • 多字节数据类型向少字节数据类型转换,需要开发者保证不越界
  • double可以自动转换出float,浮点数自动/隐式转换得到整数
  • 两个不兼容的不同类型的值相加,结果自动在转化为更大的数(正数)的类型

强制类型转换

  1. java风格 c风格
    (类型)参数名
  2. 类型作为函数名,()作为参数
  • double(a)
  • int(x+y)
  • int(6)%4
  1. 复杂风格
    static_cast <type-id>(expression)

位运算(不考)

输出输出语句

C++语句

空语句
声明语句 int i=1;
表达式语句 a=3; 3+5;
流程控制语句 选择、循环、跳转
标号语句 : 配合goto,break continue
符合语句 {}

输入输出语句

C++中输入和输出通过输入输出流来实现
cin,cout是预定义的流类对象,定义位于头文件iostream中

cin

  • 在缺省的情况下,cin自动跳过输入的空白符
  • cin.get()读空格,cin.geiline()读一行
  • 按照八进制,十六进制解释读到的数据 cin>>hex>>i
  • 输入数据的格式、个数和类型与cin中所列举的变量一一对应

cout
cout可以搭配控制符,实现格式化输出

  • 数据的进制、宽度、对齐方式、小数点位数
  • cout<< setfill('*')
  • cout << setw(3) << 4 << setiosflag(ios::left) << 12 << setw(4) <<4 << endl;
  • 用*填充,字符位置宽度(每次都要设置),对齐方式(更改时设置)
  • 结果**4124***

输出操作符

  • cout<<12<< hex <<12 << oct << 12 << 12
  • 对于浮点数,格式包括科学计数法输出,有效位数等
  • cout<< setprecision(5) <<12.34567 <<\endl
    ostream类也可以提供函数输出

分支循环控制流程

与java完全相同

posted @ 2025-05-21 12:29  NonooTion  阅读(25)  评论(0)    收藏  举报