c++primer:变量和基本类型详解

目录
  • 前言
  • 类型转换
  • 变量声明与定义的关系
  • 变量命名规范
  • 复合类型
    • 引用
    • 指针
  • const限定符
    • const的引用
    • 指针和const
    • constexpr和常量表达式
    • auto类型说明符
    • decltype
    • 头文件保护符
    • 习题
    • 练习
  • 总结

前言

我只写我觉得重要的,同时把一些我觉得比较重要的习题做一下

类型转换

类型所能代表的范围决定了转换的过程

比如:当我们把一个非布尔类型的算数值赋给布尔类型时,初始值为0则代表结果为false,否则结果为true

当把浮点数赋给整数时,会舍去小数部分。

当赋给无符号整数的值大于它表示的范围时,结果是这个值对(无符号整数最大值+1)取模。

变量声明与定义的关系

变量声明规定了变量的类型和名字,在这一点上定义与之相同,但是除此之外,定义还申请存储空间,也可能为变量赋一个初始值。如果要声明一个变量而非定义它,则使用extern关键词,但是如果给extern修饰的变量初始化了,就抵消了extern的作用

变量命名规范

  • 标识符体现具体含义
  • 变量名一般用小写字母
  • 用户自定义的类名一般用大写字母开头,如Sales_item
  • 如果标识符由多个单词组成,则单词之间应该有明显区别,如student_loan或者studentLoan

复合类型

符合类型是基于基于其他类型定义的类型。

引用

引用为对象起了另一个名字,引用类型引用另一种类型通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名
引用不是对象,而是一个已经存在的对象的另一个别名

由于引用不是对象,所以不存在引用的引用

指针

指针本身就是个对象,允许对指针赋值和拷贝,指针无需在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将有一个不确定的值。

指针的值(即地址)应该属于下列4种状态之一

  • 指向一个对象
  • 指向紧邻对象所占空间的下一个位置
  • 空指针
  • 无效指针(上述指针的其他情况)

*关于指向紧邻对象所占空间所占对象的下一个位置,说实话没太看懂,首先我在知乎查找了一下,然后又查看了一下英文版的c++ primer,发现其意思就是对象末尾的与其相邻的下一个位置,比如:
int t=5;int p=&t,则p+1就代表这个紧邻对象所占空间的下一个位置,但是这个对象没有定义,所以原则上是不能解引用的

const限定符

默认情况下,const 对象仅在文件内有效

const的引用

可以把引用绑定到const对象上去,就像绑定到其他对象上去一样,称之为对常量的引用,对常量的引用不能用来用作修改其绑定的对象,比如:

有const int a=3,const int &b=a则&b=34,int &c=b这种行为是不允许的,因为&b=34会改变对象的值,而此时是常量,而int &c=b若可以的话则能通过&c=34来改变对象的值,这显然是不能允许的。

引用所引用的类型与其所引用对象的类型一致

指针和const

由于指针本身就是个对象,因此指针本身是不是常量以及指针指向的对象是不是常量就是两个独立的问题。用顶层const(top-level const)代表指针本身是个常量,而用名词底层const(low-level const)代表指针指向的对象是个常量

constexpr和常量表达式

常量表达式(const expression)代表值不会改变并且在编译过程中就能得到计算结果的表达式。

例子:

const int max_files=20 //是常量表达式

const limit =max_files+1//limit是常量表达式

int ret=20//不是常量表达式,因为其值会改变

const int sa=get_size()//不是常量表达式,因为其值需要到运行期间得到

常量表达式是由它的数据类型和初始值来决定的

c++11新规定允许将变量声明为constexpr类型以便由编译器来验证变量是否为常量表达式,声明为constexpr的变量一定是一个常量,而且必须由常量表达式初始化 例:constexpr int sa=20

在constexpr限定符种如果定义了一个指针,限定符constexpr仅对指针有效,对指针指向的对象无关

auto类型说明符

其作用是让编译器去分析表达式的类型,例:auto a=a1+a2,编译器会自动将a的类型转换成a1+a2结果的类型。

decltype

其作用是得出表达式的类型 例:decltype(f()) sum=y,sum的类型就是f()返回值的类型

如果表达式的类型是解引用操作,则decltype将得到引用类型,因为解引用操作能给得到指针所指向的对象,并且能改变对象的值,所以是引用

如果decltype使用一个不加括号的变量则得到的结果是该变量的类型,如果使用一个加括号的变量,则得到的结果是引用类型,因为加了括号就代表这个变量是一个表达式,而变量是作为左值的特殊表达式,所以是引用

头文件保护符

#ifdef 当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真,一旦检查得到为真则一直运行直到遇到#endif为止

习题

练习读程序写结果

unsigned int u=10,u2=42;

std::cout<<u2-u<<std::endl;//32

std::cout<<u-u2<<std::endl;//4294967264,其结果逻辑上是-32但是超出了其范围0-4294967295需要对4294967296取模得到4294967264

练习

下列那些初始化是正确的

  • int i=-1,&r=0;//错误,0为字面值常量,需要常量引用
  • int *const p2=&i2;//正确
  • const int i=-1,&r=0;//正确
  • const int *const p3=&i2;//正确
  • const int *p1=&i2;//正确
  • const int &const r2;//错误,因为引用不是对象,不能用const修饰
  • const int i2=i,&r=i;//正确

总结

本片文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++ primer基础之容器insert

    C++ primer基础之容器insert 今天学习C++ 基础知识的时候遇到这样问题,始终出现segments fault.最后才发现原来是自己对"容器insert之后迭代器会失效"的理解不够透彻. 题目如下: 假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改? auto iter = iv.begin(); auto mid = iv.begin() + iv.size() / 2; while(iter != mid){ if(*iter == some_

  • 《C++ Primer》隐式类类型转换学习整理

    C++ Primer中有这样一句话:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个转换.这句话用下面一段代码表示为: class A { A(B b);//单个实参的构造函数 func(A a); } ..... A a: B b; a.func(b);//func函数本应该接受A类型的实参,但是由于特殊构造函数的存在,所以B类型的参数b借助这个特殊的构造函数转化为A类型对象,完成转换.所以这条语句是正确的 从上述代码段可以看出来,单个实参调用的构造函数定义了类类型到其他类型的转

  • c++ primer中的const限定符

    const 限定符  const是一种类型修饰符,用于说明永不改变的对象.const对象一旦定义,就无法再赋新值,所以必须被初始化. 例:const int bufsize = 512; 它的值一旦定义就不能被改变,并且默认情况下,仅对文件内有效. 如果要在多个文件中共享const对象,则需要在定义和声明前都加extern: 初始化和对const的引用 例: const int ci = 1024; const int &r1= ci; r1 = 42; // 值不可以被改变 int &r

  • C++ Primer注解之引用和指针

    引用(reference) 引用: 指的是左值引用(lvalue reference) 引用:取小名,达到绑定对象的作用,而不是将初始值拷贝给引用 special: 不能和 字面值 和 计算结果 绑定 引用不是对象 对引用的操作,都是在与之绑定的对象上进行的 除了两种例外外,引用的类型 和 与之绑定的对象 要严格匹配 int i = 1024; int &r = i; //√ int型的r,来引用int型的i double dval = 3.14; int &reval = dval; /

  • C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解

    & 和*这样的符号,既能用作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义: int i = 42; int &r = i; //&紧随类型名出现,因此是声明的一部分,r是一个引用 int *p; //*紧随类型名出现,因此是声明的一部分,p是一个指针p p = &i; //&出现在表达式中,是一个取地址符 *p = i; //*出现在表达式中,是一个解引用符 int &r2 = *p; //&是声明的一部分,*是一个解引用

  • c++primer:变量和基本类型详解

    目录 前言 类型转换 变量声明与定义的关系 变量命名规范 复合类型 引用 指针 const限定符 const的引用 指针和const constexpr和常量表达式 auto类型说明符 decltype 头文件保护符 习题 练习 总结 前言 我只写我觉得重要的,同时把一些我觉得比较重要的习题做一下 类型转换 类型所能代表的范围决定了转换的过程 比如:当我们把一个非布尔类型的算数值赋给布尔类型时,初始值为0则代表结果为false,否则结果为true 当把浮点数赋给整数时,会舍去小数部分. 当赋给无

  • C++ Primer的变量和基本类型详解

    目录 1.类型转换 含有无符号类型的表达式 2.字面值常量 整形和浮点型字面值 字符和字符串字面值 转移序列 指定字面值的类型 布尔字面值和指针字面值 总结 1.类型转换 对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型.比如 把非布尔类型的数据赋值给布尔类型时,初始值为0则结果为false,否则为true: 将布尔值赋值给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1: 将浮点数赋给整数类型时,

  • C++变量和基本类型详解

    目录 基本内置类型 1. 不同平台下基本类型的字节数 2. 算数类型的最小尺寸 3. 数据类型选择的经验准则 4. 有符号类型和无符号类型 5.初始化与赋值 6. 声明与定义 7. C++关键字 8.1 初始化 8.2 const引用 8.3 const与指针 小结: 9. constexpr 和常量表达式 10. 处理类型 总结 基本内置类型 算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型 1. 不同平台下基本类型的字节数 类型 16位平台 32位平台 64位平台 char 1 1

  • Python 变量类型详解

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python 中的变量赋值不需要类型声明. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值. 例

  • Javascript类型系统之String字符串类型详解

    javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持String对象,它是一个原始值的包装对象.在需要时,javascript会自动在原始形式和对象形式之间转换.本文将介绍字符串String原始类型及String包装对象 定义 字符串String类型是由引号括起来的一组由16位Unicode字符组成的字符序列 字符串类型常被用于表示文本数据,此时字符串中的

  • Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer.在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字

  • Python的语言类型(详解)

    Python 是强类型的动态脚本语言 . 强类型:不允许不同类型相加 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候 脚本语言:一般也是解释型语言,运行代码只需要一个解释器,不需要编译 强类型语言和弱类型语言 1.强类型语言:使之强制数据类型定义的语言.没有强制类型转化前,不允许两种不同类型的变量相互操作.强类型定义语言是类型安全的语言,如Java.C# 和 python,比如Java中"int i = 0.0;"是无法通过编译的: 2.弱类型语言:数据类型

  • javascript类型系统_正则表达式RegExp类型详解

    前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换.本文将介绍正则表达式的RegExp对象,以及正则表达式涉及 到的属性和方法 对象 javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法:另一种是构造函数写法 Perl写法 正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性

  • Java多线程Atomic包操作原子变量与原子类详解

    在阅读这篇文章之前,大家可以先看下<Java多线程atomic包介绍及使用方法>,了解atomic包的相关内容. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic是指不能分割成若干部分的意思.如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的.通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成) 在x86平台上,CPU提供了在指令执行期间对总线加锁的手段.

  • 基于java变量和作用域以及成员变量的默认初始化(详解)

    ava中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前java会自动初始化成员变量,对于基本数据类型的的自动初始化如下: java基本类型默认初始化值 int 0 short 0 byte 0 long 0 float 0.0 double 0.0 boolean false char 0 例如: public class test{ private i

随机推荐