- 博客(191)
- 收藏
- 关注
原创 详细地调查这个话题
现在我们已经讨论了哪些功能以及它们的一些基本功能,让我们仔细看看它们为什么有用。为什么使用函数?新的程序员经常问:“我们把代码放在函数里面,难道不能直接放在main里面吗?“在许多情况下(特别是简单的例子),它可以。然而,函数提供了一些好处,使它们在非平凡程序中非常有用。繁琐的程序(例如小于20行代码),一些或所有这些可以在main()。然而,对于较长的程序(或
2018-01-02 22:00:11
301
原创 函数并使用逻辑非操作符
123456#include // for fabs()bool isAlmostEqual(double a, double b, double epsilon){ // if the distance between a and b is less than epsilon, then a and b are "close enough" return fab
2017-12-18 13:07:42
508
原创 正常值为浮点数
你已经看到了所有这些工作的方式,而且它们非常直观。每个操作符求值为布尔值true(1)或false(0)。下面是一些使用整数运算符的示例代码:#include int main(){ std::cout << "Enter an integer: "; int x; std::cin >> x; std::cout << "Enter a
2017-12-18 13:06:25
362
原创 输入无效文本输入的方式
大多数具有某种用户界面的程序都需要处理用户输入。在您编写的程序中,您一直在使用STD::CIN来请求用户输入文本输入。因为文本输入是如此自由的(用户可以输入任何东西),用户很容易输入不期望的输入。在编写程序时,应该始终考虑用户将如何(无意地或以其他方式)滥用程序。一个写得很好的程序会预测用户会如何误用它,或者处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个处理错误案例的程序
2017-12-16 22:34:46
573
原创 具有永久改变x值的副作用
上面例子中的赋值操作符具有永久改变x值的副作用。即使语句完成执行后,x的值也将为5。++运算符具有增加X X的输出具有修改控制台的副作用副作用。然而,副作用也会导致意想不到的结果:int add(int x, int y){ return x + y;} int main(){ int x = 5; int value = add(x, ++x);
2017-12-16 22:33:44
234
原创 布尔变量
为了理解位操作操作符,首先需要了解整数是如何用二进制表示的。我们在第2.4节讨论了这一点——整数,并将在这里展开。考虑一个正常的十进制数,例如5623。我们直观地理解这些数字是指(5×1000)+(6×100)+(2×10)+(3×1)。因为有10个十进制数,所以每个数字的值增加了10倍。bool b1 = true; // copy initializationbool b
2017-12-16 22:32:10
7216
原创 调试器确实能派上用场
不幸的是,编译器将无法捕捉到这些类型的问题,因为编译器只知道您编写了什么,而不是您打算的内容。在上面的例子中,这些错误很容易被发现。但在最不平凡的程序,许多语义错误不容易通过目测找到代码。幸运的是,调试器确实能派上用场。调试器调试器是一种计算机程序,它允许程序员控制程序如何执行,并观察程序运行时发生了什么。例如,程序员可以使用调试器一行一行地执行程序
2017-12-16 22:30:35
201
原创 语法错误和语义错误
语法和语义错误编程很难,有很多方法可以犯错误。错误通常分为两类:语法错误和语义错误(逻辑错误)。语法错误发生时,你写了一个声明针对C++语言的语法无效。这包括错误如缺少分号,未声明的变量,不匹配的括号或大括号,和未结束的字符串。例如,下面的程序包含了相当多的语法错误:#include ; // preprocessor statements can't have a s
2017-12-16 22:29:22
40482
原创 命令执行下一行代码
你知道的,运行程序时,执行一开始就调用main()。因为我们想调试main()里面,我们开始用“进入”命令。在Visual Studio 2005 Express,去“调试”菜单并选择“进入”,或按F11。如果您使用的是不同的IDE,请在菜单中找到“进入”命令并选择它。当你这样做的时候,应该发生两件事。首先,因为我们的应用程序是一个控制台程序,控制台输出窗口应该打开。它
2017-12-16 21:49:04
4173
翻译 使用调试生成配置
语法和语义错误编程很难,有很多方法可以犯错误。错误通常分为两类:语法错误和语义错误(逻辑错误)。语法错误发生时,你写了一个声明针对C++语言的语法无效。这包括错误如缺少分号,未声明的变量,不匹配的括号或大括号,和未结束的字符串。例如,下面的程序包含了相当多的语法错误:#include int add(int x, int y){ return x - y
2017-12-16 21:47:07
348
原创 为你节省时间和挫败感
既然你已经学会了一些程序的基本知识,让我们更仔细地看看如何设计一个程序。当你坐下来写一个程序时,通常你会遇到一些你想解决的问题,或者你想模拟的情况。新的程序员常常很难理解如何将这个想法转换成实际的代码。但事实证明,你从日常生活中获得了很多你需要的解决问题的技能。记住最重要的事情(最难做的事情)是在开始编程之前设计你的程序。在许多方面,编程就像建筑。如果你不按照建筑计划建造房子,会发生什
2017-12-16 21:44:11
198
原创 识别它们为字符串
什么是字符串?第一个C++你写的程序,可能看起来像这样:#include int main(){ std::cout << "Hello, world!" << std::endl; return 0;}那么什么是“你好,世界”!“到底是什么?“你好,世界!“是连续字符的集合,称为字符串。在C++中,我们使用字符串来表示文本,如姓名、地址、词和句子。字
2017-12-11 16:04:09
280
原创 则该函数或表达式有副作用
在第三行中,x和y是递增/递减之前,他们的评价,所以他们的新值打印由cout。在第五行,一个原始值的临时副本(x = 6,y = 4)发送给cout,然后原来的x和y是递增的。这就是为什么从后缀式操作符的结果没有改变到下一行。规则:在增量和后减量后有利于预增加和预减量。前缀版本不仅更加高效,你就不太可能遇到奇怪的问题。副作用如果某个函数或表达式修改某个状态(例如
2017-12-11 15:50:43
416
原创 值5只被赋值给变量B
这似乎更清楚了,值5只被赋值给变量B。因为在一行上定义多个变量并初始化它们是错误的原因,我们建议您只在一行中定义多个变量,如果没有初始化其中的任何一个变量。规则:在初始化任何一行时避免在一行上定义多个变量。定义变量的地方旧的C编译器强迫用户在函数顶部定义函数中的所有变量:int main(){ // all variable up to
2017-12-11 15:48:02
297
原创 类型的C++除了整数
在上一节关于变量的课程中,我们谈到了变量是可以存储信息的一段内存的名称这一事实。简要概括起来,计算机的随机存取存储器(RAM),可供程序使用。当定义一个变量时,为该变量预留一块内存。最小的内存单位是二进制数字(位),它可以容纳0或1的值。你可以认为有点像传统的电灯开关,要么是灯关了(0),要么是(1)。两者之间没有关系。如果你看一段随机的内存,你会看到的是…01101010010101
2017-12-11 15:45:54
316
原创 理解运算符的操作
在数学中,运算是一种数学运算,它包含零或多个输入值(称为操作数),以产生输出值。常用操作(如加法)使用表示操作的特殊符号(如+)。这些符号称为运算符。编程人员的工作方式相同,但名称可能并不总是符号。运营商的工作类似于函数,输入参数并返回一个值,但它们更简明。例如,4 + 2 * 3是读比添加更容易(4,多(2, 3))!为了正确地评估表达式,如4 + 2 * 3,我们必须理解运算符的操
2017-12-11 15:19:27
230
原创 变量未初始化的可能性
这似乎更清楚了,值5只被赋值给变量B。因为在一行上定义多个变量并初始化它们是错误的原因,我们建议您只在一行中定义多个变量,如果没有初始化其中的任何一个变量。规则:在初始化任何一行时避免在一行上定义多个变量。定义变量的地方旧的C编译器强迫用户在函数顶部定义函数中的所有变量:int main(){ // all variable up to
2017-12-11 15:18:01
3475
原创 数据类型的C++
因为计算机上的所有数据只是一个位序列,所以我们使用一种数据类型(通常简称为“类型”)来告诉我们如何以某种有意义的方式解释内存的内容。您已经看到了一个数据类型的例子:整数。当我们将一个变量声明为一个整数时,我们告诉编译器“这个变量地址的内存将被解释为一个整数”。当您将值赋给数据类型时,编译器和CPU负责将您的值编码为该数据类型的适当比特序列的细节。当你要求你的价值回来时,你的数字是从记忆
2017-12-11 15:16:31
185
原创 静态持续时间
E这一章涉及了很多材料。干得好,你做得很好!语句块(又名。一个复合语句)由编译器处理,就好像它是一个语句一样。它们放在花括号({和})之间,几乎到处使用。本地变量是在变量定义点上创建的,当它们声明的块退出时就会被销毁。只能在声明它们的块内访问它们。全局变量是在程序启动时创建的,当它结束时就会被销毁。它们可以在程序中的任何地方使用。非const全局变量通常应该避免
2017-12-11 14:13:34
964
原创 算术表达式求值
算术表达式求值当评估表达式,编译器将每个表达为单独的子表达式。算术运算符要求它们的操作数是相同类型的。为了确保这一点,编译器使用以下规则:如果一个操作数是一个比int窄的整数,它将进行整数提升(如上所述)到int或无符号int。如果操作数仍然不匹配,则编译器找到最高优先级的操作数,并隐式地将其他操作数转换为匹配。操作数的优先级如下:#include #incl
2017-12-11 14:10:45
392
原创 转换为二进制的补码
为了理解位操作操作符,首先需要了解整数是如何用二进制表示的。我们在第2.4节讨论了这一点——整数,并将在这里展开。考虑一个正常的十进制数,例如5623。我们直观地理解这些数字是指(5×1000)+(6×100)+(2×10)+(3×1)。因为有10个十进制数,所以每个数字的值增加了10倍。二进制数的工作方式相同,只是因为只有2个二进制数(0和1),每个数字的值增加了2倍。就
2017-12-11 14:08:57
3744
原创 调试器试图再次打电话
单步执行是一种调试器功能,它允许您逐行执行(逐步执行)代码行。这允许您孤立地检查每一行代码,以确定它是否按预期的方式运行。实际上有3种不同的步进指令:单步执行、单步执行、逐步退出。我们将依次讨论每一个问题。步进进入命令执行下一行代码。如果该行是函数调用,则“进入”进入函数并返回函数顶部的控件。让我们来看一个非常简单的程序:345678
2017-12-10 14:22:29
285
原创 为什么使用函数?
现在我们已经讨论了哪些功能以及它们的一些基本功能,让我们仔细看看它们为什么有用。为什么使用函数?新的程序员经常问:“我们把代码放在函数里面,难道不能直接放在main里面吗?“在许多情况下(特别是简单的例子),它可以。然而,函数提供了一些好处,使它们在非平凡程序中非常有用。组织程序越来越复杂,有所有的代码都生活在main()功能变得越来越复杂。函数几乎就像一个小型
2017-12-10 14:20:31
5226
原创 调试器确实能派上用场
语法和语义错误编程很难,有很多方法可以犯错误。错误通常分为两类:语法错误和语义错误(逻辑错误)。语法错误发生时,你写了一个声明针对C++语言的语法无效。这包括错误如缺少分号,未声明的变量,不匹配的括号或大括号,和未结束的字符串。例如,下面的程序包含了相当多的语法错误:#include ; // preprocessor statements can't have a s
2017-12-10 11:27:17
186
原创 告诉函数开始和结束
基本格式不像一些其他的语言,C++不执行任何一种格式对程序员的限制(记住,信任程序员!)。许多不同格式的C++程序的方法已经在多年的发展,你会发现分歧上哪个是最好的选择。我们的基本经验是,最好的样式是产生最可读代码,并提供最一致性的代码。下面是我们对基本格式化的建议:1)你的标签应设置为4位(大部份有此配置)。一些IDE默认为3位,这是好的。使用空格
2017-12-10 11:24:50
403
原创 检测提取是否失败并修复它
正如你所看到的,我们正在使用一个while循环不断循环,直到用户提供有效的输入。如果他们不这样做,我们要求他们再试一次,直到他们给我们有效的输入,关闭程序,或摧毁他们的电脑。错误案例2:提取成功,但与外来输入考虑以下程序的执行:输入双值:5 * 7你认为接下来会发生什么?输入双值:5 * 7输入下列内容之一:+,-,*,或/:输入一个双重值:5 * 7是35该程序打印正
2017-05-08 21:46:38
376
原创 以及如何使用STD
现在,考虑无效的用户输入可能会打破这个程序。首先,我们要求用户输入一些数字。如果他们输入的东西以外的数字(例如“Q”)呢?在这种情况下,提取将失败。第二,我们要求用户输入四个可能的符号之一。如果他们输入的字符以外的符号之一,我们的期望呢?我们将能够提取输入,但我们目前不处理发生什么事后。第三,如果我们要求用户输入一个符号,他们输入一个字符串,如“*你好”。尽管我们可以提取我们需要的“*
2017-05-08 21:45:39
438
原创 很容易输入不期望的输入
多数有某种用户界面的程序需要处理用户输入。在您一直在编写的程序中,您一直在使用STD:CIN要求用户输入文本输入。因为文本输入是自由格式的(用户可以输入任何东西),所以用户很容易输入不期望的输入。在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误的情况下
2017-05-08 21:43:40
281
原创 运行时,程序按行执行
函数参数const做两件事。首先,它告诉人调用函数,函数不会改变自我价值的价值。其次,它确保功能不改变自我价值的价值。编译时间与运行时间当你在编译程序的过程中,这就是编译时间。在编译时,编译器可以确保你的代码语法正确,并将你的代码转换成目标文件。在运行应用程序的过程中,这就是运行时。运行时,程序按行执行。constexprC++实际上有两种不同的常数。运行时常量是那些初始化
2017-04-20 11:21:58
398
原创 程序的整体复杂性。
现在我们已经讨论了什么是函数和它们的一些基本功能,让我们来仔细看看它们为什么有用。为什么要使用功能?新程序员经常会问:“我们在代码里面放的代码不能直接放在main里面吗?”“在许多情况下(特别是简单的例子),它可以。然而,功能提供了一些好处,使他们非常有用的非平凡的程序。组织程序越来越复杂,有所有的代码都生活在main()功能变得越来越复杂。一个函数几乎就像一个小型程序,我们可
2017-04-20 11:18:09
799
原创 而它等待被提取到变量
大多数有某种用户界面的程序需要处理用户输入。在项目中,你一直在写,你一直在使用std::cin要求用户输入文本输入。因为文本输入是自由格式的(用户可以输入任何东西),所以用户很容易输入不期望的输入。在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误的情况
2017-02-27 15:09:29
392
原创 因为乘法有一个更高的优先级比加法
为了正确地评估表达式,如4 + 2 * 3,我们必须了解运营商做什么,以及正确的顺序,适用于他们。运算符在复合表达式中计算的顺序称为运算符优先级。使用正常的数学优先规则(在加法之前求解乘法的状态),我们知道上面的表达式应该以4 +(2 * 3)来计算,以产生值。在C++中,所有操作都分配了一个级别的优先。优先评价最高的。你可以在下面的表格中看到乘法和除法(优先级5)比加法和减法有更高的优先级(
2017-02-27 15:07:57
2729
原创 ,而它等待被提取到变量
大多数有某种用户界面的程序需要处理用户输入。在项目中,你一直在写,你一直在使用std::cin要求用户输入文本输入。因为文本输入是自由格式的(用户可以输入任何东西),所以用户很容易输入不期望的输入。在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误的情况
2017-02-22 11:01:24
203
原创 变量x现在应该有值
在上步和断点的前一课中,您学习了如何使用调试器通过程序监视执行路径。然而,通过一个程序只有一半使调试器有用。调试器还允许您检查变量的值,因为您通过您的代码。我们的例子将使用Visual Studio调试器表达--如果你使用不同的IDE /调试器命令可能略有不同的名称或位置在不同的位置。在继续之前:确保您的程序设置为使用调试生成配置。看变量监视变量是在调试模式执行程序时检查变量值的过
2017-02-22 10:56:17
372
原创 C风格转换一般应避免
在前面的第4.4节--隐式类型转换(强制)中,您了解到编译器有时会隐式地将值从一个数据类型转换为另一个数据类型。当您希望将一个数据类型的值提升到更大的类似数据类型时,使用隐式类型转换系统是很好的。许多新的程序员尝试这样的东西:浮点F = 10 / 4;。然而,因为10和4都是整数,没有晋升发生。整数除法在10 / 4上执行,产生值为2,然后隐式转换为2,并分配给f!如果您使用的是字面值(如
2017-02-21 11:50:13
597
原创 你会期望这个程序产生结果
你会期望这个程序产生结果:3和4的总和是:7但事实上,它根本不编译!Visual Studio 2005 Express产生以下编译错误:添加.cpp(5):错误c3861:'添加':未找到标识符添加.cpp(9):错误c2365:“添加”:重定义;以前的定义是“以前未知的标识符”此程序未编译的原因是编译器按顺序读取文件。当编译器为函数的调用()对main()线6,不知道什么补
2017-02-21 11:48:30
419
原创 同时还鼓励平台无关的编程。
C语言是由贝尔实验室的Dennis Ritchie在1972开发的,主要是作为一种系统编程语言。也就是说,用一种语言编写操作系统。里奇的主要目标是产生一个简约的语言,易于编译,允许高效的内存访问,产生高效的代码,而不需要大量的运行时支持。因此,对于一个高层次的语言,它的设计是相当低的水平,同时还鼓励平台无关的编程。23456789101112#include int
2017-02-21 11:47:15
246
原创 寻址存储器
寻址存储器这一课直接建立在“1.3:变量的第一次看”部分的材料上。在上一节关于变量的课程中,我们讨论了一个事实:变量是用于存储信息的内存的名字。简要概括起来,计算机的随机存取存储器(RAM),可供程序使用。当一个变量被定义时,该变量的一部分被预留给那个变量。内存的最小单位是二进制数字(位),它可以保持0或1的值。你可以认为有点像一个传统的光开关-要么灯关闭(0),或它是在(1)。中间没
2017-02-13 22:39:53
646
原创 它不妥善处理这种情况下
在这种情况下,我们要求用户输入四个符号中的一个,但他们输入了“k”代替。“K”是一个有效的字符,因此std::cin愉快地提取它变量运算,这会返回到主。但我们的程序不希望这种情况发生,所以它不妥善处理这种情况下(因此从来没有输出任何东西)。这里的解决办法很简单:做输入验证。这通常由3个步骤组成:1)检查用户输入是否是你所期望的。2)如果是的话,将该值返回给用户。3)如果没有,告诉用
2017-01-04 17:15:45
307
原创 所以用户很容易输入不期望的输入
大多数有某种用户界面的程序需要处理用户输入.。在项目中,你一直在写,你一直在使用std::cin要求用户输入文本输入。因为文本输入是自由格式的(用户可以输入任何东西),所以用户很容易输入不期望的输入.。在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序.。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误
2017-01-04 17:12:21
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人