C++知识讲解(一)

2023-11-04

       

目录

1.1   进入 C++

1.1.1   main() 函数

1.1.2   C++注释

1.1.3   C++预处理器和 iostream 文件

1.1.4   头文件名

1.1.5   名称空间 

1.1.6   使用 cout 进行 C++ 输出

        1.endl 控制符

        2.换行符

1.1.7   C++格式

后续


该文章将收录在C++讲解的专栏里面,感兴趣的读者可以收藏学习,专栏也会定期更新,我们一起学习加油!】

PS:有兴趣的读者可以去看看《C++ Primer Plus》这本书,里面对C++的讲解非常详细,本文章也是从这本书中进行的学习和理解。

1.1   进入 C++

        跟进入程序第一天一样,我们先来输出一个 “ Hello world! ”以此来开始正式的 C++ 学习。 

//程序清单 1.1

#include<iostream>
int main()
{
	using namespace std;
	
	cout << "Hello world!";
	cout << endl;
	cout << "Welcome." << endl;
	return 0; 
}

显示结果:

Hello world!
Welcome.

--------------------------------

        对于之前接触过其他语言的读者来说,这一部分可能很好理解。但是没有接触过任何语言的读者也不用担心,所有的问题都会在以后慢慢进行讲解。

上述示例包含以下元素:

        1. 注释,由前缀 // 标识。

        2. 预处理器编译指令 #include。

        3. 函数头: int mian()。

        4. 编译指令 using namespace。

        5. 函数体,用 { 和 } 括起。

        6. 使用 C++ 的 cout 工具显示消息的语句。

        7. 结束 mian() 函数的 return 语句。

下面详细介绍这些元素。首先先来介绍一下 mian() 函数。

1.1.1   main() 函数

        程序清单 1.1 的基本框架

#include<iostream>
int main()
{
	.....
    ...
    ..
	return 0; 
}

        这几行表明有一个名为 main() 的函数,并表述了该函数的行为。其中 int main() 是函数头,其后面的 {} 中的部分叫做 int mian() 函数的函数体。函数头对函数与程序其他部分之间的接口进行了总结;函数体是指出函数应做什么的计算机指令。在 C++ 中,每条完整的指令都称为语句。记住在C/C++中都是以分号结束(这一点,从python语言过来的读者可能会不太习惯)。

        mian() 中最后的 return (返回语句),是用来结束该函数的。

1.1.2   C++注释

        C/C++的注释都是以 // 打头,到尾行结束。注释可以位于单独的一行上,也可以和代码部分同行。很多人在写代码的时候不喜欢注释,认为太浪费时间太麻烦了。其实有经常注释的习惯是非常好的,不仅可以让别人更好的理解自己的代码内容,也可以为自己将来重新回顾代码的时候更加的方便,在一些大型的项目中就显得尤为重要。

为便于理解,这里给出两个示例:

//可以独占一行来进行注释


int main()   //也可以与代码同行
{
    .....
    ...
}
/*

C++ 里也可以使用 C 中的这个注释符号

它的好处是可以用于成段的注释

这样就显得很方便

*/

1.1.3   C++预处理器和 iostream 文件

        如果熟悉 C 的读者都明白在编写一段程序前需要写一个预处理文件

#include<stdio.h>

        但是在 C++ 中有所不同,如果程序需要使用 C++ 中的输入或者输出工具时,需要使用下述两行代码

#include<iostream>
using namespace std;

        #include<iostream> 该编译指令导致预处理器将 iostream 文件的内容添入到程序中。这是一种典型的预处理器操作:在源代码被编译之前,替换或者添加文本。

        那么为什么要添加 iostream 文件呢?因为要涉及程序与外部世界的间的通信。其中最典型的便是:从键盘中获取数据(cin);向外输出数据显示(cout)。这里我们就不过多的讲解了。

        注意:使用 cin 和 cout 进行输入和输出的程序必须包含文件 iostream。

1.1.4   头文件名

        学过其他语言的读者应该不陌生。像 iostream 这样的文件叫做包含文件(include file)——由于它们被包含在其他文件中;也叫头文件(header file)——由于它们被包含在文件的起始处。C++ 编译器自带了很多头文件,每个头文件都支持一组特定的工具。熟悉 C语言 的读者都明白,C 的传统是,头文件使用扩展名 h,将其作为一种通过名称标识文件类型的简单方式。

举个例子:

#include<stdio.h>
#include<math.h>   //支持各种C语言数学函数的头文件

        但是在C++的用法变了。现在对老式 C 的头文件保留了扩展名 h (C++ 程序仍然可以使用这种文件),而 C++ 的头文件没有扩展名,在原有的基础上去掉扩展名 h 使之成为 C++ 风格的名称。

同样举个例子:

#include<iostream>
#include<cmath>    //支持各种C语言数学函数的头文件

        可以看出 C/C++ 二者的区别。下 表1.1 对头文件得到命名约定进行了总结。 

头文件命名约定

头文件类型 约定 示例 说明
C++旧式风格 以 .h 结尾 iostream.h C++程序可用
C 旧式风格 以 .h 结尾 math.h C/C++程序可用
C++新风格 没有扩展名 iostream C++程序可用,需使用 namespace std
转换后的 C 加上前缀 c,没有扩展名 cmath C++程序可用,可用不是 C 的特性,如 namespace std

表 1.1(来源:《C++ Primer Plus》)

1.1.5   名称空间 

        如果使用 iostream ,而不是 iostream.h ,则应使用下面的名称空间编译指令来使 iostream 中的定义对程序可用:

using namespace std;

        这个叫做 using 编译指令。这里不需要过多的了解,但是我们需要知道一些情况:

//程序清单 1.2

//如果不使用 using namespace std;

#include<iostream>
int main()
{
	std::cout << "Hello world!";
	std::cout << std::endl;
	std::cout << "Welcome." << std::endl;
	return 0; 
}

显示结果:

Hello world!
Welcome.

--------------------------------

        结果和 程序清单1.1 没有区别,但是中间的却有所不同—— 程序清单1.2 种使用的是 std::coutstd::endl 这两种,原因就是因为没有使用 using 编译指令。所以这些区别请大家要注意一下。

1.1.6   使用 cout 进行 C++ 输出

        这里我们简单介绍一下它的用法,对于其内部的过程就不过多的赘述了:

        如何在 C++ 种显示一条消息?

        熟悉 C 的读者应该知道在 C 中的输出是 printf()函数,接受数据的是 scanf();但是在 C++ 中却不是这样。在 C++ 中我们使用 cout << 的方式来进行:

cout << "Hello world!";

这样就在界面上显示了 “ Hello world! ” 的消息,其实通过 << 的方向也可以明白,其数据的传输方向是传输给 cout 的,这个就仅仅解释到这里即可。

        1.endl 控制符

        现在来看看另一段代码:

cout << endl;

        这一段代码显示出来其实就是换行的作用,说的官方一点就是:重起一行。诸如 endl 等对于 cout 来说特殊含义的特殊符号被称为控制符(manioulator)。和 cout 一样,endl 也是在头文件 iostream 中定义的,且位于名称空间 std 中。

通过这些我们会发现一个有趣的地方:在打印字符串时,cout 不会自动移到下一行,因此如果我们按以下方式去写代码:

cout << "The Good, the";
cout << "Bad, ";
cout << "and the Ukulele";
cout << endl;

那么其输出结果为:

The Good, theBad, and the Ukulele

这时为了保证代码的可观赏性 cout << endl; 就显得尤为重要了。

        2.换行符

        C++ 中还提供了另一种在输出中指示换行的旧式方法:C 语言符号 \n

cout << "Hello world!\n";

        这个对于熟悉 C语言 的读者来说可以跳过。其实效果跟上述的一样,可以减少输入量。

另一方面,如果要生成一个空行,大多数人选择输入 endl (本人也是,可能是习惯导致):

cout << "\n";  //生成空行

cout << endl;  //生成空行

换行符是一种被称为 “ 转义序列 ” 按键组合。

1.1.7   C++格式

        一个好的程序不仅仅是它可以正常运行,还要有一定的规范化以及可观赏性,所以我们在以后编写程序时可以遵循下面的规范:

        1. 每条语句占一行。

        2. 每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行。

        3. 函数中的语句都相对于花括号进行缩进。

        4. 与函数名称相关的圆括号周围没有空白。

前三条规则旨在确保代码清晰易读;第四条规则帮助区分函数和一些也是用圆括号的C++内置结构(如循环)。

后续

        学习的过程不能一蹴而就,因此长篇大论未必是有效的学习,故本篇的讲解到此先告一段落,希望大家可以认真看完并且理解。

下一篇将讲解——C++ 语句(函数的调用等等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++知识讲解(一) 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • opencv旋转矩形定义以及求交叉面积

    目录 代码 运行结果 结果分析 用途 可以用来计算目标检测或者分割等结果IOU 代码 import cv2 旋转矩形的定义 中心点x 中心点y 宽 高 角度值 rect1 0 0 100 100 10 x y w h rect2 0 0 5
  • Ubuntu Workbench连接失败 your connection attempt failed for user ‘root‘ to the MySQL server at 127.0.0.1

    1 打开终端进入root帐号 2 进入 etc mysql debian cnf文件 查看debian sys maint帐号密码 3 运行 mysql u debian sys maint p 输入密码 4 修改root帐号的密码 ALT
  • 经纬度换算数值_经纬度换算

    1 经纬度和弧度的转换 转换方法 角度转弧度为 180 角度 弧度变角度为180 弧度 经度分东经和西经 从0 经线向东内到180 为东容经 用字母E表示 从0 经线向西到180 为西经 用字母W表示经度的变化规律是东经向东度数越来越大 西
  • VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

    需求如下 B列为产品名为合并单元格 C列为供应商名 G H列为金额数据 数据源放在同一个文件夹内 B列产品名来源于工作薄名称中间的字符串 C列供应商名来源于工作薄中的sheet名 G H列金额数据来源于工作薄中sheet中固定单元格P25
  • c++函数指针

    1 声明函数指针 double cal int prototype double pf int 指针pf指向的函数 输入参数为int 返回值为double pf cal 指针赋值 2 指针作为函数的参数传递 void estimate in
  • Pytorch Tensor的索引与切片

    1 Pytorch风格的索引 根据Tensor的shape 从前往后索引 依次在每个维度上做索引 示例代码 import torch a torch rand 4 3 28 28 print a 0 shape 取到第一个维度 print
  • svg格式文件转换为png图片文件

    快要下班的时候 领导突然找我 发给我一个页面 说觉得这个页面的图标感觉不错 想把它做成图片放在项目里 我打开网页 用f12一看 用的是svg 这个我也不知道咋处理啊 但是遇到事情我们先不要慌 先在网上找找有没有解决办法 一顿搜索之下 我找到
  • 1. TensorRT量化的定义及意义

    前言 手写AI推出的全新TensorRT模型量化课程 链接 TensorRT下的模型量化 课程大纲如下 1 量化的定义及意义 1 1 什么是量化 定义 量化 Quantization 是指将高精度浮点数 如float32 表示为低精度整数
  • warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

    下面的文章详细介绍了这个warning的来源和解决方法 也可以关闭优化 当然关闭优化并不是最终解决方法 down vote accepted First off let s examine why you get the aliasing
  • Linux 问题排查及性能调优

    总目录 一 问题场景 1 CPU问题 2 内存问题 3 iowait问题 二 性能优化简介 三 Linux 问题排查顺序 前言 监控大盘 第一步 平均负载 第二步 cpu核 第三步 内存 第四步 磁盘 第五步 带宽 第六步 具体应用 第七步
  • Redis知识整理一:基础知识

    什么是Redis Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 并提供多种语言的API Redis缓存数据库特点 1 Redis支持数据的持久化 可以将内存中的数据保存在磁
  • 使用Yii查询CodeStriker

    公司使用的质量管理系统 评审活动 缺陷跟踪和文档库 中 需要与CodeStriker互动 开发如下类实现基本功能 View Code 1
  • adb shell 中直接激活界面命令

    adb root adb remount adb shell am start a android settings WIFI SETTINGS am activityManager a action n 包名 包名 activity ad
  • Selenium成长之路-03使用IDLE编写第一个自动化脚本

    windows用户 在电脑的开始菜单搜索IDLE 并启动ILDE python GUI 编译器 接下来我们就进入编译的环节了 1 导入webdriver包 from selenium import webdriver 2 初始化一个火狐浏览
  • mac支持的硬盘格式 什么硬盘格式是mac和win支持的

    大部分硬盘在默认出厂前都会设定好一个固定的磁盘格式 如果该格式与用户电脑所使用的系统不兼容 就无法正确地进行硬盘读写甚至硬盘识别 对于Mac系统和Windows系统而言 它们都有自己支持的某些硬盘格式 什么是Mac支持的硬盘格式 什么硬盘格
  • 如何关闭电脑防火墙

    开始 控制面板 WINDOWS防火墙 打开或关闭WINDOWS防火墙 关闭WINDOWS防火墙 不推荐 效果截图
  • C++ 中的变量定义

    变量定义就是告诉编译器在何处创建变量的存储 以及如何创建变量的存储 变量定义指定一个数据类型 并包含了该类型的一个或多个变量的列表 如下所示 type variable list 在这里 type 必须是一个有效的 C 数据类型 可以是 c
  • 有源医疗器械电磁兼容EMC的测试标准、测试项目以及测试方法

    目录 有源医疗器械电磁兼容的测试标准 测试项目以及测试方法 一 什么是电磁兼容 1 1电磁兼容概念 1 2电磁兼容三要素 1 3为什么要做电磁兼容 1 4电磁兼容测试项目 二 电磁兼容标准 2 1基础标准 2 2通用标准 2 3产品族标准
  • WPF 图表控件LiveCharts的应用——室内监控可视化

    需求 为了实现一个完整软件系统 必须具备一些基本的数据呈现控件 例如曲线图 柱状图 饼图等 本次的业务需求为 利用LiveCharts展示后台模拟的温度变化 像Winform里面 微软为我们提供了比较完整的Chart控件 但是在WPF组件中
  • C++知识讲解(一)

    目录 1 1 进入 C 1 1 1 main 函数 1 1 2 C 注释 1 1 3 C 预处理器和 iostream 文件 1 1 4 头文件名 1 1 5 名称空间 1 1 6 使用 cout 进行 C 输出 1 endl 控制符 2