C++常量与变量

日期:2020年3月27日
作者:Commas
注释:开始我的C++学习的奇妙之旅,愿意和我一起学习的小伙伴们可以关注我,也可以给我点赞,如若博客有哪里写的不好的地方,还望各位看官指出,非常感谢……
更多C++内容,请看我的《C++学习的奇妙之旅》



一、前言

程序中的数据包括常量与变量

  • 常量:在程序执行期间不会改变的固定值,又称为字面量
  • 变量:在程序执行期间可以改变的数据,本质是程序可操作的存储区的名称
类型 读写说明
常量 仅只读,在定义并初始化后,不可修改原值
变量 可读写,在程序运行中,可以修改变量值

二、基本数据类型

在C++中,数据类型决定了变量存储的大小和布局,基本数据类型可分为以下4类:

  • 整数类型(int):基本整型;
  • 实数类型(float\double):浮点数类型;
  • 布尔类型(bool):存储true\false;
  • 字符类型(char):实际上存储的是整数,可以容纳单字符的编码(ASCII码);

不知道有没有注意到,和其他高级程序语言有点不太一样,C++在基本数据类型中,是没有字符串变量的,可以采用字符串数组存储字符串的,这很C字符串风格,但是已经不鼓励使用了,不过还是要了解一下。在标准C++类库中有一个String类,这个是值得推荐的,很C++字符串风格。
另外,值得指出的是,数据的基本类型所占字节数在不同的编译环境可能会有不同,可以用sizeof(type)查看,如以下我们查看一下int类型所占字节长度:

#include <iostream> 
using namespace std; 

// main() 是主程序,程序开始执行的地方
int main()
{
    //int类型所占字节长度
    cout<<sizeof(int)<<endl;
        
    return 0;
}

控制台输出:4

三、常量

(一)常量的类型

(1)整数常量

其实,一个整数常量的表示 = 前导 + 数据本身 + 后缀 表示;

前导决定数据的进制,如下:

  • 十进制:无前导 + 数据本身
  • 八进制: 前导0 + 数据本身(0~7
  • 十六进制:前导0x + 数据本身(0~9A~F
//(1)十进制
2020
//(2)八进制
012 
018 //是不合法的,八进制不可能会出现8
//(3)十六进制
0xFF 

后缀决定数据类型,整数常量默认的是有符号(signed)的整数(long),可修改为:

  • 无符号整数(unsigned):U 或 u,大小写随意;
  • 长整数(long):L 或 l,大小写随意;
2020  //整数
2020l //长整数
2020u //无符号整数
2020ul //无符号的长整数,符号顺序随意
2020lu //无符号的长整数,符号顺序随意

(2)浮点常量

其实,一个浮点常量的表示 = 整数部分 + . + 小数部分 + 后缀 + 指数部分 表示;

后缀决定数据类型,整数常量默认的是(double)浮点类型,可修改为:

  • float类型:F 或 f,大小写随意;

另外,指数部分引入E 或 e来表示,如3.14159可以表示为314159E-5L

(3)布尔常量

  • true:代表真,不应该将其看作为1;
  • false:代表假,不应该将其看作为0;

(4)字符与字符串常量

类型 表示 存储形式 示例
转义字符 如\n,\t等 该字符的ASCII码 \n,存放的是换行符\n的ASCII码
字符 西文单引号‘’ 该字符的ASCII码 ‘a’,存放的是a的ASCII码
字符串 西文双引号“” C风格的字符串:字符的ASCII码依次存放,在最后的默认用\0作为结束标记 “a”,存放的是a、\0的ASCII码

字符串常量前面还可以加前导(前缀),可以改变类型,如下:

前导(前缀) 含义 类型
u Unicode 16字符串 char16_t
U Unicode 32字符串 char32_t
L 宽字符 wchar_t
u8 UTF-8(仅用于字符串字面量常量) char
u"hello"
U"hello"
L"hello"
u8"hello"

(二)常量的定义

定义变量总共有两种方式:

  • 使用#define预处理器,语法如下:
#define identifier value
//identifier:标识符
//value:常量的值

//示例:
#define LENGTH 2020;
#define NAME 'C';
  • 使用const关键字,语法如下:
const type identifier = value;
//type:定义常量的类型
//identifier:标识符
//value:常量的值

//示例:
const int LENGTH = 2020;
const char NAME = 'C';
//以下为抛出异常的示例:
//因为char是单字节字符类型,不可以存字符串
const char NAME = "C";//invalid conversion from 'const char*' to 'char' [-fpermissive]
const char NAME = 'Commas';//character constant too long for its type

四、变量

(一)变量的定义

在使用变量前,我们要规定变量的类型,这样编译器才知道要给这些变量多少个字节的空间,我们先来看看,如何定义一个变量吧,语法如下:

type variable_list;

示例如下:

//(1)定义多个同类型的变量
int i,j,k;
//(2)定义单个变量
double d;

(二)变量的定义并且初始化

分配了这些字节空间后,变量的初始值是什么,得分以下情况讨论:

  • 全局变量:所有函数体之外的变量,如果不给初始值,它也会自动有一个基础的初始值,比如说数值型的基础初始值为0;
  • 局部变量:在函数体内部的变量,如果不给初始值,那么值是不确定的,可能会是垃圾数据,所以定义后对变量初始化,是一个非常好的习惯。
//NO1:
type variable_name = value;
//NO2:
type variable_name(value);
//NO3:
type variable_name = {value};
//NO4:
type variable_name{0}

示例如下:

#include <iostream> 
using namespace std; 

// main() 是主程序,程序开始执行的地方
int main()
{   

    int intA = 1;
    int intB(2);
    int intC = {3};
    int intD{4};

    cout<<"intA="<<intA<<endl;
    cout<<"intB="<<intB<<endl;
    cout<<"intC="<<intC<<endl;
    cout<<"intD="<<intD<<endl;
        
    return 0;
}

控制台输出:
intA=1
intB=2
intC=3
intD=4

另外,NO3和NO4使用了大括号,此初始化方式被称为列表初始化,该方式不允许信息的丢失,如int类型变量无法存储double类型的数据,但是NO1和NO2会将溢出信息丢失从而不会影响程序的后续运行,如下:

//(1)可以运行
int intA = 1.111;//丢失小数部分,输出值为:1
int intB(2.222);//丢失小数部分,输出值为:2
//(2)抛出异常
int intC = {3.33};//抛出异常:error: narrowing conversion of '3.3300000000000001e+0' from 'double' to 'int' inside { } [-Wnarrowing]
int intD{4.44};//抛出异常:error: narrowing conversion of '4.4400000000000004e+0' from 'double' to 'int' inside { } [-Wnarrowing]

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/105138910

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章