首页 > 编程语言 >learncpp-1 C++基础

learncpp-1 C++基础

时间:2024-07-22 22:19:44浏览次数:10  
标签:语句 初始化 提取 变量 int 基础 C++ learncpp

1 C++基础

1.1 语句和程序结构

  • 语句是一条让计算机执行某个动作的指令,是C++语言中最小的独立计算单元

在高级语言(例如C++)中,一条语句可能编译成多条机器指令

  • 大多数语句以;结尾

声明语句
跳转
表达式语句
复合语句
选择语句(条件语句)
迭代语句(循环语句)
try代码块

  • 函数是顺序执行的语句的集合
  • 每个C++程序都必须有一个main函数。当程序运行时,main函数中的语句按顺序执行
  • 在编程中,函数/对象/类型/模板的名字称为标识符
  • 编译器负责检查代码是否符合C++语言的基本语法,如果不符合就会报语法错误

1.2 注释

  • 注释会被编译器忽略
  • 在库、程序或函数级别,使用注释来描述这些代码要实现的功能(what)
  • 在库、程序或函数中,使用注释来描述如何实现(how)
  • 在语句级别,使用注释来描述原因(why)

1.3 对象和变量介绍

  • 程序就是指令的集合,这些指令会操纵数据以产生需要的结果,数据是任何可以由计算机移动、处理或存储的信息。
  • 数据在计算机中是以二进制形式存储的
  • 当运行程序时,操作系统会将程序加载到RAM中。任何硬编码到程序本身的数据(例如"hello,world"等文本)也会在这时候被加载

操作系统还会保留一些额外的RAM,供程序在运行时使用。此内存的常见用途是存储用户的输入/存储文件或网络中读取的数据/存储程序运行时计算得到的值,以便后续使用
可以将RAM看作一系列编号的方格,可用于在程序运行时存储数据

  • 一个对象是一块可以存储值的内存区域

可以使用对象来存储和获取值,不用知道这些对象实际存放在内存中的哪个位置

  • 可以用一个标识符来命名一个对象,带有名字的对象称为变量
  • 实例化代表对象将被创建并分配一个内存地址,变量在使用之前必须被实例化
  • 在C++中,变量的类型在编译期就确定了,并且不能被改变

1.4 变量赋值和初始化

  • 使用=进行变量赋值的方式叫做拷贝赋值:将=右边的值拷贝到=左边的变量中
  • 不同形式的初始化
int a; // 默认初始化
int b = 5; // 拷贝初始化
int c(6); // 直接初始化

// 列表初始化方法(c++11,更推荐)
int d{7}; // 直接列表初始化
int e = {8}; // 拷贝列表初始化
int f{}; // 值初始化
  • 在大多数情况下,默认初始化不执行任何初始化,因此变量具有不确定的值
  • 对于复杂类型来说,拷贝初始化的效率较低(c++17中修复了这些问题)
  • 当值被隐式地复制或转换时,也会使用拷贝初始化。例如通过值将参数传递给函数、通过值从函数返回、通过值捕获异常
  • 直接初始化最初是为了更有效地初始化复杂对象而引入的;当值被显式地转换为另一种类型时,可以使用直接初始化
  • 使用列表初始化时,编译器会检查类型是否匹配
int a = 4.5; // 编译通过
int b(4.5); // 编译通过
int c{4.5}; // 编译报错
  • {}会将变量初始化为0或空,因此值初始化也称零初始化
  • [[maybe_unused]]可以用于修饰一些暂时不使用的变量,从而不会产生编译告警

1.5 iostream介绍

  • io库是C++标准库的一部分,用于处理基本输入输出
  • io库包含了一些预定义的变量供使用,例如std::coutstd::cin
  • <<称为插入运算符,>>称为提取运算符
  • std::cout会将输出内容先存入缓冲区
  • std::endl除了会输出一个新行,还会刷新缓冲区,因此效率不如\n
  • C++的io库未提供一种方法,可以在用户不按回车键的情况下接收键盘输入(有些第三方库提供了这种方法)
  • 输入缓冲区中的每行输入数据都以\n字符结束
  • 基本的提取过程:
    • 1.前置的空格、制表符、换行符都会被丢弃
    • 2.如果输入缓冲区是空的,>>将等待用户输入
    • 3.>>会提取尽可能多的连续字符,直到遇到换行符或者对于接收变量来说无效的字符
  • 提取的结果:
    • 如果上面的步骤3中提取了任何字符,则提取成功。提取的字符被转换成一个值并赋给变量
    • 如果步骤3没有提取到任何字符,则提取失败。后面的所有提取都会立即失败,直到std::cin被清空
  • 任何未提取的字符(包括换行符)仍可用于下一次提取尝试
int x{};
std::cin>>x;

如果用户输入了5a并回车,则5被赋给了x,a和\n则留在了输入缓冲区用于下一次提取
如果用户输入了b并回车,由于b不是有效的整数,因此提取失败,x被设置为0,未来的提取都会失败,直到输入流被清空

1.6 未初始化的变量和未定义的行为

  • 一个未初始化的变量的默认值就是那个内存地址中本来就已经存在的值(是不确定的)
  • 未定义的行为可能有如下表现:
    • 程序每次运行产生不同结果
    • 程序总是产生同样的错误结果
    • 程序看起来在工作,但在之后又产生错误结果
    • 程序崩溃
    • 程序在一些编译器上工作,但在另一些编译器不工作
    • 程序不工作,除非改变一些看似无关的代码
  • implementation-defined behavior指的是留给实现(编译器)来定义的语法行为,这些行为必须是一致的且有文档记录,不同的编译器可能会产生不同的结果
  • 避免使用与编译器的具体实现相关的语法,例如sizeof

标签:语句,初始化,提取,变量,int,基础,C++,learncpp
From: https://www.cnblogs.com/akongogogo/p/18317101

相关文章

  • learncpp-2 函数和文件
    2函数和文件2.9命名冲突和命名空间两个(或多个)同名函数(或全局变量)被引入到属于同一程序的不同文件中,这将导致链接器错误。两个(或多个)同名函数(或全局变量)被引入到同一个文件中。这将导致编译器错误。不同的作用域(例如命名空间)中可以有相同的标识符只有声明和定义可以出现......
  • 刷算法中途复习基础知识
    1.数据类型数据类型分为值传递和引用传递值传递:八大数据类型  Byteshortint long floatdouble charboolean引用传递:类接口 数组其中字符串和枚举类型比较特殊,但是都是基于引用数据类型来实现的.基本数据类型只能存自己类型的值,没有其他额外的功能。引用......
  • 【NCSI】基础概念
    1、介绍NCSI就是带外管理系统和网卡交互的一种协议。2、术语2.1外部网络接口网络控制器的接口,提供与外部网络基础设施的连接;也称为端口。2.2内部网络接口网络控制器的接口,提供与平台上运行的主机操作系统的连接。2.3Channel通过单个网络接口(端口)支持NC-SIPass-through......
  • C++学习笔记
    -------------------------------------------------------------------给一个无单向不循环链表的首结点l,编写程序反转链表,并返回反转后的链表首结点structllist_node{intval;structllist_node*next;};structllist_node*func(structllist_node*l){......
  • 基础概念
    NameServer:Broker的注册中心,负责Broker管理、路由信息管理(消息来了到哪个Broker)Broker:RocketMQ核心,负责接收生产者消息、消息持久化、消息过滤....Topic:主题,收发消息都要指明主题,生产者的消息往哪里发、消费者到哪里消费消息Queue:队列,每个Topic默认4个队列,真实存放......
  • c++(4) sophus可视化和计算误差
             CMakeLists.txtproject(test)find_package(PangolinREQUIRED)include_directories(${Pangolin_INCLUDE_DIRS})find_package(fmtREQUIRED)set(FMT_LIBRARIESfmt::fmt)#set(v1_node_filemain.cpp)add_executable(v1_nodemain.cpp)......
  • 【c++经典面试题】有关string类的深浅拷贝
    题目背景基于自实现string类substr成员函数时遇到的问题。代码展示stringstring::substr(size_tpos,size_tlen)//声明时len的参省值位npos { assert(pos<_size); if(len>_size-pos)//如果len的长度大于有效字符长度,那么重置为有效字符长度 { le......
  • Java基础-学习笔记06
    **06访问修饰符封装继承多态**访问修饰符public公开级别,对外公开protected受保护级别,对子类和同一个包中的类公开default默认级别,无修饰符,向同一个包的类公开private私有级别,只有类本身可以访问,不对外公开修饰符可以用来修饰类中的属性,成员方法以及类只有默认......
  • c++(0) sophus矩阵转换
     1安装sophus2使用代码2-1R,t矩阵q四元数转换so3和se3 CMakeLists.txtcmake_minimum_required(VERSION3.0)project(useSophus)#为使用sophus,需要使用find_package命令找到它find_package(SophusREQUIRED)#Eigeninclude_directories("/usr/include/eigen3"......
  • kafka 基础知识
    1、Kafka简介ApacheKafka是由Apache开发的一种发布订阅消息系统。Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感......