变量和基本类型C++

Posted wanluToPro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量和基本类型C++相关的知识,希望对你有一定的参考价值。

第2章 变量和基础类型

基本内置类型

算术类型

标识符      含义        大小
bool        布尔类型    未定义大小
char        字符        8位
wchar_t     宽字符      16位
char16_t    Unicode字符 16位
char32_t    Unicode字符 32位
short       短整形      16位
int         整形        16位
long        长整形      32位
long long   长整形      64位
float       单精度浮点数 6位有效数字
double      双精度浮点数 10位有效数字
long double 扩展精度浮点数 10位有效数字

使用sizeof函数

//example.1
#include <iostream>
int main(int argc, char **argv)

    std::cout << "basic type   size(bytes)" << std::endl;
    std::cout << "bool " << sizeof(bool) << std::endl;// bool 1
    std::cout << "char " << sizeof(char) << std::endl;// char 1
    std::cout << "wchar_t " << sizeof(wchar_t) << std::endl;// wchar_t 2
    std::cout << "char16_t " << sizeof(char16_t) << std::endl;// char16_t 2
    std::cout << "char32_t " << sizeof(char32_t) << std::endl;// char32_t 4
    std::cout << "short " << sizeof(short) << std::endl;// short 2
    std::cout << "int " << sizeof(int) << std::endl;// int 4
    std::cout << "long " << sizeof(long) << std::endl;// long 4
    std::cout << "long long " << sizeof(long long) << std::endl;// long long 8
    std::cout << "float " << sizeof(float) << std::endl;// float 4
    std::cout << "double " << sizeof(double) << std::endl;// double 8
    std::cout << "long double " << sizeof(long double) << std::endl;// long double 12
    return 0;

带符号类型和无符号类型

除了bool和扩展字符类型外,其他基本类型都可以划分为带符号signed和无符号unsigned两种、signed可表示正数 0 负数,无符号表示大于等于0的数

//example2.cpp
#include <iostream>
int main(int argc, char **argv)

    int int_var = -1;
    short short_var = 1;
    long long_var = -1;
    long long long_long_var = -1;
    // int\\short\\long\\long long 都是带符号的
    //在前面加上unsigned变为无符号类型
    unsigned int unsigned_int_var = 1;
    unsigned short unsigned_short_var = 1;
    unsigned long unsigned_long_var = 1;
    unsigned long long unsigned_long_long_var = 1;
    unsigned unsigned_var = 1; //为unsigned int类型
    //字符类型 有三种
    char char_var = '1'; // char 是signed 还是 unsigned是由编译器决定的
    signed char signed_char = '1';
    unsigned char unsigned_char = '1';
    // float 与 double 、long double 没有无符号与有符号一说
    return 0;

类型转换

也就是将一种数据类型转化为另一种数据类型

//example3.cpp
#include <iostream>
int main(int argc, char **argv)

    bool b = 42;          // 42 !=0 -> true
    int i = b;            // true -> 1
    i = 3.14;             // 3.14->3
    double pi = i;        // 3->3.0
    unsigned char c = -1; //如果char占8比特 c的值为255
    signed char c2 = 256; //如果char占8比特,c2的值是未定义的 超出了它的表示范围
    // warning: overflow in conversion from 'int' to 'signed char' changes value from '256' to '0'
    if (1) // int(1)->bool(true) 类型自动转换
    
        std::cout << "hello world" << std::endl; // hello world
    
    return 0;

含有无符号类型的表达式

注:切勿混用带符号类型和无符号类型

//example4.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    unsigned u = 10;
    int i = -42;
    cout << i + i << endl; //-84
    cout << i + u << endl; // 4294967264
    //第一个是正确的 第二个就有问题 因为 i被从int变为unsigned int 有一部分数据丢失了
    //也就是表达式有无符号与有符号时 有符号先变为无符号然后再进行计算
    unsigned u1 = 42, u2 = 10;
    cout << u1 - u2 << endl; // 32
    cout << u2 - u1 << endl; // 4294967264
    // u2-u1编译器认为结果还是unsigned int 类型 但结果是个负数 就是结果超出了unsigned的表示范围然后给强制转换了
    //当从无符号数减去一个值时,不管是不是无符号数,都应该保证结果不是负数
    /*
    //会出现死循环 因为u不可能<0
    //当u=0 时 又将u-1 然后使得u=4294967295
    for (unsigned u = 10; u >= 0; --u)
    
        cout << "hello world" << endl;
    */
    return 0;

字面值量

什么是字面值量,通俗点就是我们直接表达出来的例如

int x=123;//123就是字面值量

字面值

//example5.cpp
#include <iostream>
using namespace std;

int main(int argc, char **argv)

    //整形
    cout << 20 << endl;   // 20十进制
    cout << 024 << endl;  // 20八进制
    cout << 0x14 << endl; // 20十六进制
    //浮点型字面值是double
    cout << 3.14159E0 << endl; // 3.14159
    cout << 3.14159 << endl;   // 3.14159
    cout << 0. << endl;        // 0
    cout << 0e0 << endl;       // 0
    cout << .001 << endl;      // 0.001
    //字符与字符串
    cout << '1' << endl;           // 1
    cout << "hello world" << endl; // hello world
    //字符串字面量多行书写
    cout << "hello "
            "world"
         << endl; // hello world
    //转义字符
    cout << "hello\\'\\n";        // hello'
    cout << "\\115\\115" << endl; // MM
    // bool类型
    cout << true << endl; // 1
    return 0;

转义字符
换行符 \\n       横向制表符 \\t   报警(响铃)符 \\a
纵向制表符 \\v   退格符  \\b      双引号  \\"
反斜线 \\\\       问号 \\?        单引号 \\'
回车符 \\r       进纸符  \\f

也可以使用ASCII码表达方式

\\a:\\7   \\n:\\12  \\40:空格
\\0:空字符    \\115:字符M   \\0xd:字符M
指定字面值的类型
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    cout << L'a' << endl;     // wchar_t
    cout << u8"hi!" << endl;  // utf-8 8位编码Unicode
    cout << 42ULL << endl;    // unsigned long long
    cout << 42ul << endl;     // unsigned long
    cout << 1E-3F << endl;    // float
    cout << 1.14159L << endl; // long double
    // 97 hi !42 42 0.001 1.14159
    return 0;

指定规则

1、前缀

u   Unicode 16字符  char16_t
U   Unicode 32字符  char32_t
L   宽字符          wchar_t
u8  UTF-8           char

2、后缀

后缀        最小匹配
u or U      unsigned
l or L      long
ll or LL    long long
f or F      float
l or L      long double

变量

变量提供一个具名的、可供程序操作的存储空间

变量定义

c++是静态类型语言(在编译阶段检查类型,检查类型的过程称为类型检查)不想python、javascript它们不进行声明就能使用甚至不需要给定类型,而C++是一个严格的语言

//example7.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    //定义整型的sum units_sold
    //声明整型的value
    int sum = 0, value, units_sold = 0;
    std::string book("hello world");
    //定义字符串类型
    cout << book << endl; // hello world
    return 0;

上面使用了std里面的string类型、先了解他是存储可变长字符串的就好

关于初始化

C++11列表初始化方式及其初始化类型自动转换

//example8.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    double price = 10.2, discount = price * 0.6;
    // price先被定义立即被初始化为10.2,然后定义discount并且进行初始化
    // C++11的列表初始化 花括号初始化
    int var_1 = 0;
    int var_2 = 0;
    int var_30;
    int var_4(0);
    cout << var_1 << " " << var_2 << " " << var_3 << " " << var_4 << endl;
    // 0 0 0 0

    //列表初始化类型转换 要避免这种用法
    long double ld = 3.1415926;
    int ald, b = ld;           //会进行警告
    cout << a << " " << b << endl; // 3 3
    int c(ld), d = ld;             //会自动执行类型转换
    cout << c << " " << d << endl; // 3 3
    return 0;

默认初始化值

当定义变量时没有初始化初值,则变量被默认初始化,初始化为什么由变量类型决定

//example9.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    int a;
    float b;
    double c;
    cout << a << " " << b << " " << c << endl;
    // 4201248 8.9997e-039 1.79166e-307
    //可见充满了不确定性
    std::string empty_string;
    cout << empty_string << endl; //空字符串
    return 0;

在多数情况下、我们遵循约定,尽可能地在定义变量时就将其初始化为一个值

变量声明和定义的关系

在C++中允许程序进行分离式编译:程序分割为若干个文件、每个文件可被独立编译。C++将定义与声明分开。声明使得名字让程序所知,一个文件想使用别处定义的名字必须包含其声明,而定义负责创建于名字关联的实体

// example10.cpp
int i = 23; //全局变量i
int k = 1;
double pi = 3.1415926;
//example11.cpp
#include <iostream>
extern int i; //声明int i 但i定义在examlple10.cpp程序内
extern int k;
int j;             //声明并定义
extern int f = 13; //在全局范围内对extern变量初始化则会抵消extern的作用
int main(int argc, char **argv)

    // extern double pi = 12.0;
    //在函数内部初始化extern变量会报错
    std::cout << k << std::endl; // 1
    std::cout << i << std::endl; // 23
    std::cout << f << std::endl; // 13
    return 0;

shell windows

if ($?)  g++ example11.cpp example10.cpp -o example11  ; if ($?)  .\\example11 

bash linux

g++ example11.cpp example10.cpp -o example11 & ./example11

变量的类型转换

可分为强制转换和自动转换

//example20.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    //自动转换
    int var_int = 12;
    double var_double = var_int;
    cout << var_double << endl; // 12
    int var_int_1 = var_double;
    cout << var_int_1 << endl; // 12
    //自动转换是一件危险的事情,也可超出表示范围造成精度以及数据丢失

    //强制转换
    double r = 12.21;
    int r_int_part = (int)r;
    cout << r_int_part << endl; // 12
    //强制转换就是啥也不管将原来变量内存中的数据拷贝给目标变量
    //强制转换在后面的void指针就有涉及,你们很快就会见面
    return 0;

标识符

C++的标识符由字母、数字和下划线组成必须由下划线或字母开头

int _a=12,your_num=8,_your_num2=12;
//int 2d=12; error

C++变量命名规范

  • 标识符要能体现其实际含义
  • 变量名一般用小写,如index,不要使用Index或INDEX(常量除外)
  • 用户自定义的类名一般以大写字母开头,如Sales_item
  • 如果标识符有多个单词组成,则单词间应有明显区分,如student_loan或studentLoan,不要使用studentloan

C++保留关键词

别害怕,这些东西可不是人记的,知道有这么回事就行了

alignas     C++11 用于内存对齐相关
alignof     C++11 用于内存对齐相关
asm          C++11 用于在C++代码中直接插入汇编语言代码
auto         C++98,C++11 C++ 98 中,auto 的作用是让变量成为自动变量(拥有自动的生命周期),但是该作用是多余的,变量默认拥有自动的生命周期。在C++11 中,已经删除了该用法,取而代之的作用是:自动推断变量的类型。
bool         C++11 声明布尔类型变量
break         C++98 跳出循环语句
case         C++98 用于switch分支语句
catch         C++11 异常处理,与try一起用于捕获并处理异常
char         C++98 声明字符类型
char16_t     C++11 声明UTF-16字符集表示的字符类型,要求大到足以表示任何 UTF-16 编码单元(16位)。
char32_t     C++11 声明UTF-32字符集表示的字符类型,要求大到足以表示任何 UTF-16 编码单元(32位)。
class         C++98,C++11 1)声明类;声明有作用域枚举类型(C++11);2)在模板声明中,class 可用于引入类型模板形参与模板模板形参;3)若作用域中存在具有与某个类类型的名字相同的名字的函数或变量,则 class 可附于类名之前以消歧义,这时被用作类型说明符
const          C++98 可出现于任何类型说明符中,以指定被声明对象或被命名类型的常量性(constness)。
const_cast   C++11 在有不同 cv 限定(const and volatile)的类型间进行类型转换。
constexpr    C++11,14,17 constexpr 说明符声明可以在编译时求得函数或变量的值。然后这些变量和函数(若给定了合适的函数实参)可用于编译时生成常量表达式。用于对象或非静态成员函数 (C++14)声明的constexpr说明符蕴含const。用于函数声明的 constexpr说明符或static 成员变量 (C++17)蕴含inline。若函数或函数模板的任何声明拥有constexpr说明符,则每个声明必须都含有该说明符。
continue     C++98 跳出当前循环,开始下一次循环
dealtype     C++11,14,17 检查实体的声明类型,或表达式的类型和值类别。对于变量,指定要从其初始化器自动推导出其类型。对于函数,指定要从其return语句推导出其返回类型。(C++14)对于非类型模板形参,指定要从实参推导出其类型。(C++17)
default      C++98 用于switch分支语句
delete      C++11 解内存分配运算符,与new一起管理动态分配内存;弃置函数,如果取代函数体而使用特殊语法=delete,则该函数被定义为弃置的(deleted)。
do           C++98 do-while循环语句
double      C++98 声明双精度浮点数类型
dynastic_cast       C++11 类型转换运算符,沿继承层级向上、向下及侧向,安全地转换到其他类的指针和引用。
else         C++98 if-else条件语句
enum        C++98 声明枚举类型
explicit         C++11,17,20  指定构造函数或转换函数(C++11)或推导指引(C++17)为显式,即它不能用于隐式转换和复制初始化。explicit说明符可以与常量表达式一同使用。当且仅当该常量表达式求值为true时函数为显式(C++20)explicit说明符只可出现于在类定义之内的构造函数或转换函数(C++11)的声明说明符序列中。
export      C++98,11,20 用于引用文件外模板声明(C++11)。不使用并保留该关键词(C++11)(C++20)。标记一个声明、一组声明或另一模块为当前模块所导出(C++20)extern       C++98 具有外部链接的静态存储期说明符,显式模板实例化声明
false        C++11 布尔值假
float        C++98 声明单精度的浮点类型
for      C++98 for循环
friend       C++11 友元声明出现于类体内,并向一个函数或另一个类授予对包含友元声明的类的私有及受保护成员的访问权。
goto         C++98 程序跳转到指定的位置
if       C++98 if条件语句
inline       C++98 声明内联类型
int         C++98 声明整形类型
long         C++98 声明长整型
mutable      C++11 可出现于任何类型说明符(包括声明文法的声明说明符序列)中,以指定被声明对象或被命名类型的常量性(constness)或易变性(volatility)。
namespace        C++11 声明名称空间以避免名称冲突
new      C++11 分配运算符,与delete一起管理动态分配内存。
noexcept         C++11 1noexcept运算符,进行编译时检查,若表达式声明为不抛出任何异常则返回true2noexcept说明符,指定函数是否抛出异常。
nullptr      C++11 指针字面量,用于表示空指针
operator         C++11 为用户定义类型的操作数重载C++运算符。
private      C++11 访问说明符。在class/structunion的成员说明中,定义其后继成员的可访问性。
protected        C++11 访问说明符。在class/structunion的成员说明中,定义其后继成员的可访问性。
public       C++11 访问说明符。在class/structunion的成员说明中,定义其后继成员的可访问性。
register    C++98,17 自动存储期说明符(弃用)(C++17)register关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。不使用并保留该关键词(C++17)reinterpret_cast     C++11 类型转换运算符。通过重新解释底层位模式在类型间转换。
return       C++98 函数返回
short        C++98 声明短整型数据类型
signed      C++98 声明带符号的数据类型
sizeof      C++98 返回指向的数据对象或类型所占空间的大小,以字节(byte)为单位
static       C++98 声明具有静态存储期和内部链接的命名空间成员,定义具有静态存储期且仅初始化一次的块作用域变量,

以上是关于变量和基本类型C++的主要内容,如果未能解决你的问题,请参考以下文章

c++变量定义

字面量

TS基础知识

TS基础知识

TS基础知识

TS基础知识