C++基本变量

一 变量

1 变量声明的注意事项

  1. 使用变量前必须先声明变量
  2. C89规定,在任何执行语句之前,在块的开头声明所有局部变量。而C99以及C++中则没有此限制,只要求在使用之前声明变量即可。
  3. 可以使用auto关键字进行变量声明,编译器会根据字面量的类型自动声明相对应的变量类型;或者根据函数返回值的类型自动声明相对应的变量类型。
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main(int argc, char** argv){
        auto decimal = 0.0; // 被声明为double
        auto integer = 0;   // 被声明为int
        auto result = pow(1.5, 2); // 被声明为double
        cout << "decimal: " << decimal << endl;
        cout << "integer: " << integer << endl;
        cout << "pow(1.5, 2)= " << result << endl;
    }
    
  4. C++变量名的长度不限制,而C99标准说明变量名字符长度不能超过63个字符,超出长度的字符没有意义。即在C99中若前63的字符一样,后面的字符即使不一样也会被认作同一个变量。

2 整数类型

  1. 整数
    数据类型内存大小
    char8位
    short至少16位
    int不小于short
    long至少32为且不小于int
    long long至少64位且不小于long
  2. 无符号整数
    无符号整数就是在数据类型关键字前加上unsigned,例如:unsigned int。无符号整数能够储存的最大值是有符号类型的2倍+1。没有加unsigned的变量默认就是有符号整型。
    注意:对于char类型的变量,不一定是就是有符号的整型,这取决于编译器开发人员的实现。如果要明确使用有符号char整型,那么应该显示声明signed char
  3. char与wchar_t
    char专门用来储存字符,长度为8位,可以使用cout进行输入,以及使用cin进行输入。但这些是用来处理ASCII编码的。如果想处理Unicode-16编码,则应该使用wchar_t类型,长度为16为,相应地使用wcoutwcin进行控制台的输入和输出。
  4. 由于整数类型变量的内存大小在不同的系统中的大小是不一样的,C++提供了一个头文件cstdint(C99中的头文件是stdint.h),里面定义了精确宽度整数类型,如:ini8_t明确指定了宽度为8位的有符号整数类型,uint64_t明确指定了宽度为64位无符号整数类型。
  5. 如何选择哪种类型的整数
    a. 从内存占用方面考虑,在保证该变量能够存储所有可能值的情况下选择宽度最小的类型。可以通过climits头文件查看,比如:查看signed char的最值SHRT_MAX(最大值),SHRT_MIN(最小值)。
    b. 从运算速度方面考虑。int类型被认为是对目标计算机运算效率最高的类型,一般都使用int类型进行运算,除非是特别强调内存占用,或者计算特变大的数值。
  6. 整数的字面量(常量)的表现形式以及储存类型
    a. 第一位是1~9的整数,编译器会将其解释为十进制整数
    b. 第一位是0,第二位是1~7的数,编译器会将其解释为八进制整数
    c. 前两位是0x0X的数,编译器会将其解释为十六进制整数
    注意: 无论是以哪种进制表示整数,内存中存储的的数据都是一样的。进制只是一种表现方式。
    d. 常量的类型:
    - 除非使用后缀指定了常量类型,或者数字太大,否则都将常量储存为int
    - uU后缀用来表示无符号,用L表示long,如:200UL表示将200储存为unsigned long类型,200LL储存为long long类型。
    - 对于字符常量'A'储存为char类型。

3 bool类型

C++新增了bool类型的变量,分别用字面值true表示真和false表示假。在C语言中是没有bool类型的,C语言一般是使用0表示假,用1表示真。

  1. bool类型转化为整数:true会被转化为1,false会被转化为0
  2. 其余类型转化为bool
    a. double float long double类型的数据如果值为0.0(即尾数为0)会被转化为false
    b. 整数类型的0会被转化为false
    c. char类型的'\0'会被转化为false注意: '0'不会被转化为false
    d. 除了以上三点其余所有数据都会被转化为true

4 const常量

  1. 可以使用const指定常量,常量意味着不能修改该常量的值,常量的值只能在初始化的时候指定,如:
    const int a = 10; // 常量必须在声明时进行初始化
    a = 20; //不被允许,因为常量不能修改值
    
  2. 常量比#defien好。首先const可以声明各种数据类型的常量,而#definen只能声明字面量。其次const与变量一样具有作用域,而#defien没有作用域,会进行全局替换。
  3. 常量可以用来指定数组的长度,而变量是不能。
  4. 常量在进行列表初试化时,编译器会根据实际值自动判断是否有缩窄的现象。

5 浮点数

  1. 浮点常量的表示方法:
    a. 小数表示,如:32.23
    b. E表示法,如:3.45E63.45E-6
    c. 浮点常量一般储存为double类型,除非该常量储存不下需要long double储存。或者在常量末尾添加后缀指定储存类型,如:3.14f指定为float3.14L指定为long double
  2. 浮点类型:
    变量类型内存长度(64位操作系统)有效位(十进制)
    float至少32位,一般32位其中指数最值是+38 -37,有效位为6位
    double至少48位且不小于float,一般64位其中指数的最值是+308 -307,有效位15位
    long double不小于double,一般128位其中指数最值+4932 -4931,有效位19位
  3. 有效位通过cfloat头文件查询
    a. 通过FTL_MAX_10_EXP查询最大float的指数,或LDBL_MIN_10_EXP查询long double的十进制最小指数
    b. 通过DBL_DIG查询double类型浮点数的十进制时的有效位为15
    注意: 当浮点数加上一个超出有效位的数时结果不变。比如:
    float num = 1;
    num += 1E-6;
    cout << num << endl;
    // 输出还是1, 因为1E-6已经达到6位,而结果1.000001是7为有效数字,float中储存不了。
    
  4. 浮点数计算注意事项:
    a. 浮点类型能够表示的指数范围和有效位能够表示的精度是事实能够接受的。就好比计算原子弹爆炸所需精度与计算买菜所需精度不同。
    b. 对浮点数进行加减运算时,两个数的数量级不能相差太大,否则会丢失精度。例如:float类型的运算,1.0 + 1E-6,由于数量级之差为6,而有效位也为6,就导致此次相加结果不变,仍为1.0,精度丢失。因此加减运算时要保证:
    最大值数量级 − 最小值数量级 + 计算精度 < 浮点类型能表示的有效位 最大值数量级 - 最小值数量级 + 计算精度 < 浮点类型能表示的有效位 最大值数量级最小值数量级+计算精度<浮点类型能表示的有效位
    c. 不能对浮点数进行==判断,如:0.1 + 0.2 == 0.3结果为false,有些编译器甚至会报错,这是由于浮点数本身计算就会丢失精度,就会导致两者不等。要判断两个浮点数相等的方式可以是让两者之差小于某个值,就认为两者相等。如:abs(0.1 + 0.2 - 0.3) < 0.001如果为真,那么就认为两者相等。

6 数值类型的转换

  1. 显示转换
    a. 使用 (typename) 变量名的方式将该变量强制转换为指定类型。与C语言相同的方式
    b. 使用typename (变量名)的方式强制转换。C++特有方式。
    c. 其余方式…
  2. 隐式转换:
    a. 当两个数值进行计算时,如果两个数值的数据类型不同,会将"窄"的数据类型向"宽"的数据类型转换,如:当浮点数与整数计算,会将整数转化为浮点数;当短整数与长整数计算,会将短整数转换为长整数。
    b. 当赋值对象与被赋值对象数据类型不同时,会将赋值对象转化成被赋值对象的数据类型,如:将浮点数赋值给整数,那么就会将浮点数转换为小数。
    c. 当实参与形参的数据类型不同时,会将实参的数据类型转换为形参的数据类型。
    d. 当不能转换时编译器会报错。
    e. 转换时"缩窄"的特征:
    • 将长整数转换为短整数时,会直接截掉二进制的高位。比如将16位的short类型转化为8位char类型,那么低8位会保留,高8为会截断。
    • 将浮点数转化为整数时,会截掉小数部分,保留整数部分。注意: 不是四舍五入,而是直接省略小数部分。

7 auto数据类型

在声明变量时,可以不明确指定变量类型,而是使用auto关键字让编译器决定声明什么类型的变量。编译器会根据字面量的类型声明对应的数据类型,或者根据函数的返回类型声明对应的数据类型(这一条很方便)。如:

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char** argv){
    auto pi = 3.1415f; // 声明为float
    auto radius = 5;   // 声明为int
    auto area = pow(5, 2) * pi; // 声明为double
    cout << sizeof pi << endl;     // 输出4
    cout << sizeof radius << endl; // 输出4
    cout << sizeof area << endl;   // 输出8

    cout << area << endl; // 输出78.5375
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值