首页 > 编程语言 >C++ Primer 第一、二章 C++基础,变量和基本类型

C++ Primer 第一、二章 C++基础,变量和基本类型

时间:2023-05-29 21:36:23浏览次数:53  
标签:std 定义 二章 作用域 C++ int 名字 引用 Primer

一、C++基础

<iostream> 包含两个基础类型,istream-输入流和ostrea-输出流 。

标准库定义了四个IO对象 cin-标准输入(istream),cout-标准输出(o),cerr-标准错误(o),clog-用来输出程序运行时的一般性信息(o)。

 

#include <iostream>

int main()
{
   std::cout << "Enter" << std::endl;
   // (<<)输出运算符 左侧运算对象必须是ostream对象,右侧运算对象是要打印的值。
   // 该运算是将给定的值 写到给定的ostream对象中。
   // “Enter”是字符串字面值常量

   int v1 = 0;
   std::cin >> v1;
   //(>>)输入运算符 接受一个istream作为左侧运算对象,接受一个对象作为右侧运算对象,从给定的istream读入数据,并存入给定对象中。
   return 0;
}

 

  •  endl(操纵符):写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。 缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅仅停留在内存中等待写入流
  • 前缀std::  指出名字cout和endl是定义在名为std的命名空间中的。命名空间可以避免不经意的名字定义冲突,以及库中相同名字导致的冲突,标准库定义的所有名字都在命名空间std中。(通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明想使用来自命名空间std中的名字,如:std::cout  ,通过使用作用域运算符 (::)来指出我们想使用定义在命名空间std中的名字cout。)

二、基本类型

  • 大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为"字节"(byte),存储的基本单元称为“字”。字由字节组成。
  • 带符号类型和无符号类型:除去布尔型和扩展的字符型之外,其他整型可以划分为带符号(signed)和无符号(unsigned)两种。带符号可以表示正数、负数或0,无符号只能表示大于等于0的值。
  • 当赋给无符号类型一个超出他表示范围的数,结果是初始值对无符号类型标识数值总数取模后的余数。
  • 当赋给符号类型一个超出他表示范围的值时,结果是未定义的,程序可能继续工作,可能崩溃,也可能生成垃圾数据。
#include <iostream>

int main()
{
   unsigned char c=-1;
   //char占8比特,8比特unsigned char可以表示0~255区间内的值,-1不在区间内,实际结果是对2^8取模后的余数 -1%256=255;
   signed char c1=256;
   //signed char 理论上-127~127 大多数现代计算机的实际表示范围定在-128~127
   std::cout<<(int)c<<std::endl;(255)
   std::cout<<c1<<std::endl;(空)
   return 0;
}
  •  含有无符号类型的表达式
  • 当一个算数表达式中既有无符号数又有int值时,int值会转换成无符号数。(表达式中既有带符号类型 ,又有无符号类型,带符号数会自动转换成无符号数)
#include <iostream>

int main()
{
   unsigned u = 10, u2 = 42;
   std::cout << u2 - u << std::endl;//32
   std::cout << u - u2 << std::endl;//4294967264 (2^32-32)
   //当从无符号数中减去一个值时,不管这个数是不是无符号数,都必须保证结果不能是一个负值
   std::cout << std::endl;
   int i = 10, i2 = 42;
   std::cout << i2 - i << std::endl;//32
   std::cout << i - i2 << std::endl;//-32
   std::cout << i - u << std::endl;//0
   std::cout << u - i << std::endl;//0
}
  •   字面值常量:

 

  • 整形字面值可以写成十进制数,八进制数,或者十六进制数。 以0开头的整数代表八进制数,以0x或者0X开头的代表十六进制数。

     20/*十进制*/  、024/*八进制*/ 、 0x14/*十六进制*/

  • 浮点型字面值表现为一个小数或者以科学计数法表示的指数,其中指数部分用E或e标识。 (默认的,浮点型字面值是一个double)

 

  • 字符和字符串字面值
  • 转义序列:当遇到不可打印的字符,如退格或者其他控制字符(因为他们没有可视字符),或者在c++中有特殊含义的字符(单引号,双引号,问号,反斜线),这些情况下都要用到转义序列。(转义序列均以反斜线作为开始)。

    除了规定的转义序列外还有泛化的转义序列,其形式是\x后紧跟一个或多个十六进制数字,或者\后紧跟着1个,2个或者三个八进制数字,其中数字部分表示的是字符对应的数值。(如果反斜线后面跟着的八进制数字超过3个,只有前3个数字与  \  构成转义序列,相反, \x 要用到后面跟着的所有数字)。一般来说,超过8位的十六进制字符都以表2.2中某个前缀作为开头的扩展字符集一起使用。
  • 指定字面值类型

 

三、变量

对象: 对象是具有某种数据类型的内存空间。

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

  • 列表初始化:

 C++定义了好几种初始化的不同形式

 

 当用于内置类型的变量是,列表初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,编译器将报错。(如 double ld = 3.14; int a{ld} ,b = {ld}; 都会报错,因为存在丢失风险,小数部分会丢失);

  •  变量声明和定义的关系

    声明:声明使得名字为程序所致,一个文件如果想使用别处定义的名字则必须包含对哪个名字的声明。

   定义:负责创建与名字关联的实体。

   变量声明规定了变量的类型和名字,在这一点上定义与之相同,除此之外,定义还可以申请存储空间,也可能会为变量赋一个初值。如果想声明一个变量而非定义它,就在变量名前加关键字extern,而且不要显式的初始化变量)任何包含显式初始化的声明就成为定义,extern语句如果包含初始值就不再是声明,而是定义。

extern int ix = 1024; 定义 

int iy ;定义

extern int iy; 声明

  • 标识符

     C++标识符必须以字母或者下画线开头,用户自定义的标识符中不能出现连续两个下画线,也不能以下画线紧连大写字母开头,定义在函数体外的标识符不能以下画线开头。

 

  • 名字的作用域

    嵌套作用域:作用域能彼此包含,被包含(或者说被嵌套)的作用域成为内层作用域,包含着别的作用域成为外层作用域。

    作用域一旦声明了某个名字,它所嵌套的所有作用域中都能访问改名字,同时,允许在内层作用域中重新定义外层作用域已有的名字。

#include <iostream>

int reused = 42;// 全局作用域
int main()
{
    int unique = 0;//块作用域
    std::cout << reused << ' ' << unique << std::endl;// 42 0

    int reused = 0;
    std:: cout << reused << ' '<< unique << std::endl;// 0 0

    std:: cout << ::reused << ' '<< unique << std::endl;// 42 0
    //显式的访问全局变量reused ;输出42 0

    return 0;
}

第二条输出发生在局部变量reused定义之后,此时局部变量reused 正在作用域内,因此输出局部变量而非全局变量。

第三条输出使用作用域操作符 (::)来覆盖默认的作用域规则,全局作用域本身没有名字,所以当作用域操作符左侧为空,向全局作用域发出请求获取作用域操作符右侧名字对应的变量。

  • 复合类型(引用和指针)
  • 引用
  • 引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。(引用必须被初始化)
  • 在初始化变量时,初始值会被拷贝到新建对象中。 然而定义引用时,程序会把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。(引用并非对象,这是为已经存在的对象所起的另外一个名字)
  • 除了另外两种情况 (第一种就是只要该表达式的结果能转换成引用的类型即可,尤其,允许为一个常量引用绑定的非常量的对象,字面值,甚至是一个一般表达式)其他所有有引用的类型都要和与之绑定的对象严格匹配,而且引用之呢个绑定在对象上,而不能与字面值或者某个表达式的计算结果绑定在一起。

 

 

标签:std,定义,二章,作用域,C++,int,名字,引用,Primer
From: https://www.cnblogs.com/Ranr-/p/17441702.html

相关文章

  • 第十二届蓝桥杯c++b组国赛题解(还在持续更新中...)
    试题A:带宽解题思路:由于小蓝家的网络带宽是200Mbps,即200Mb/s,所以一秒钟可以下载200Mb的内容,根据1B=8b的换算规则,所以200Mb=200/8MB=25MB。所以小蓝家的网络理论上每秒钟最多可以从网上下载25MB的内容。代码实现:#include<iostream>#include<algorithm>usingnamespacestd......
  • Multiserver游戏服务器Demo[C++&Lua]
    代码参考代码文件参考下述详解的类图,工程参考第零章工程说明关键特性对Socket库进行封装,抹平Socket的Window&Linux的平台差异。C++嵌入lua脚本,增加开发者编码效率,减少编译时间消耗。非阻塞网络IO多线程任务模型多服务模型详解Socket库封装主要是对C++的Socket库进行......
  • C/C++家谱管理系统[2023-05-29]
    C/C++家谱管理系统[2023-05-29]题目8:家谱管理系统(1~3人)[问题描述]实现具有下列功能的家谱管理系统1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2).......
  • Linux下C++实现一个定时器
    要在Linux下实现一个定时器,可以使用以下两种方法:使用系统提供的定时器APILinux系统提供了一些定时器API,如setitimer、timer_create、timer_gettime等,可以使用这些API来实现定时器。以setitimer为例,可以按照以下步骤来使用:1.定义一个itimerval结构体变量,该结构体包含定时器的初......
  • C和C++的性能调优工具
    以下是C和C++的性能调优工具,包含工具介绍和链接:Valgrind:一款非常流行的内存调试和性能分析工具,可以检测内存泄漏、死锁等问题,并提供CPU性能分析工具。它可以跟踪程序中的所有内存分配和释放操作,并在程序执行时给出详细的报告。Valgrind是一个开源工具,支持Linux和MacOS等操......
  • c++ 模版元编程-00
    本系列文章从零开始介绍C++模版元编程,需要有C++基础。函数模版template<typenameT>Tadd(Tconsta,Tconstb){returna+b;}autoa=add(42,21);autod=add<double>(41.0,21);//无法自动推导类型的时候可以显示的指定类型类模版template<typenameT>......
  • C++-条件变量/互斥锁/lock_guard
    条件变量参考C++Reference对于条件变量的解释和例程:https://en.cppreference.com/w/cpp/thread/condition_variable条件变量和互斥锁一般结合使用。因为线程处于等待状态中,一般需要查看一个全局变量或共享的变量的状态,来决定是否停止等待继续运行程序。对于此全局变量,必须要......
  • C++头文件理解
    看了下公司内部对于头文件的使用,感觉挺乱的。对于头文件容易搞混淆的点在于:涉及多文件,多次包含的时候容易搞错比如上面CPP就有三四个文件,每一个CPP都要按照先包含config,后包含common的顺序,在编译的时候指明。但是include头文件本质上就是:在编译时把指定的文件,包含到调用的地方......
  • 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
    文章首发【重学C++】05|说透右值引用、移动语义、完美转发(下)引言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第五讲,在第四讲《【重学C++】04|说透右值引用、移动语义、完美转发(上)》中,我们解释了右值和右值引用的相关概念,并介绍了C++的移动语义以及如何通过右值引......
  • C++“高级程序设计实践(C++)”课程设计任务书[2023-05-28]
    C++“高级程序设计实践(C++)”课程设计任务书[2023-05-28]“高级程序设计实践(C++)”课程设计任务书一.课程设计的目的与任务本设计是课程——《面向对象编程(C++)》的一个关键实践环节。它是根据教学计划的要求,在教师的指导下,对学生实施程序设计训练的必要过程,是对前期课堂学习内......