1、 if语句
这个比较简单,简单提一下,test-condition就是测试条件(和前面的循环测试条件一样,会被强制为bool类型,也就是要么ture(非零),要么false(零)),statement就是一条语句或者语句块。整个if语句就是一条语句。
书中一个经典用法如下所示,结合前面章节的循环用法,来计算一下一个句子中的空格数。
如上图所示,输入1 空格 2 回车 3 空格 4 句号,一个两个空格,7个字符(注意这里总字符数不包括句号,但是包括回车!!!),比如:下图所示,输如1 空格 2 3 空格 4 句号,一个两个空格,6个字符,显然句号不计入,因为循环判断结尾false就退出了,并没有把句号字符计算上。反而是句号之前的所有字符都会被计算上,包括回车,因为cin.get的工作方式,这在循环那一章节已经总结过了。
2、 if else语句
这个逻辑比较简单,无非就是要么执行1.要么执行2,statement就是一条语句或者一个语句块(即多条语句用花括号)。注意整个if else语句就是一条语句。我们来看一看该语句的拓展,因为现实中除了二选一,其实更多是多选一。
由于C++的自由风格,我们稍微调整一下代码布局,看看会发生什么:如下图所示,没有错,所谓的if elseif else结构,其实就是前面的else下的语句块里又是一个if else语句罢了,也就是嵌套。不过下面这种本文代码风格更加直观,其实前后是一样的东西。
这只是三选一,更多选择的话,本质上还是从else部分嵌套一个if else语句。
3、 逻辑表达式
即与(&&)、或(||)、非(!),具体内容就不说了,比较简单。它们都能将两个表达式组合在一起,变成一个表达式。
逻辑运算符的的优先级比关系运算符的优先级低。这一点很重要,比如表达式 55 || 59 就不需要使用括号。关于优先级的区别:有个口诀,即先计算后比较再逻辑。也就是运算符优先级比关系运算符高,然后关系运算符又比逻辑运算符的优先级高。但除了非!运算符,因为它是三者中最高优先级的。同时与比或高级。
与运算符的一个经典应用如下:分数评级系统
非运算符,表示对其后面的表达式的真值再取反。注意,!运算符的优先级高于所有的关系运算符和算术运算
符。因此,要对表达式求反,必须用括号将其括起。一个良好的编程习惯是,该括号就括号,因为这样直观易读,不要不舍得,除非你能确信自己能正确记住所有符号的优先级。
特别的,在c++当中,还可以使用下表所示的文字表示运算符。
4、字符函数库cctype
头文件cctype中包含了很多与字符处理有关的函数。不过没有必要去一一背下来,用到了再去看,练得多了就记住了。如下图所示,这些封装好的函数很好用,比去使用与或非简洁多了。
5、?:运算符
此运算符也叫条件运算符,常被用来替代if else语句,是c++中唯一一个需要3操作数的运算符。其使用格式如下图所示。
如果1为True,则整个表达式的值为2的值,否则为3的值。
比如可以用一个表达式即可条件判断,又可以得到值,如下图所示十分方便。
6、witch语句
从多个选项当中选择一个,当然可以像之前那样不断拓展if else,但这样太费劲了。而Switch语句对这种情况更加简洁方便,操作如下图所示:
计算机执行switch语句时,会直接跳转到integer-expression所指向的那一行代码,其他的则不看。所以,integer-expression代表了某一行,必须是一个整数结果的表达式。如果不与任何一标签label匹配,则直接跳转到default那一行。
注意:case label只是行标签作标记来用的,没有别的功能,并不是各个选项之间的分界线,程序在跳转到某一行后,会执行后面的所有代码。因此要想程序只执行case项的语句,就需要使用break,从而跳到switch后面的语句去执行。书中关于其结构的描述页十分清楚,如下图所示。
此外,这种case label只有标签的功能,而没有分界线的作用的做法十分有用,比如可以合并多个case为一个case,执行同一个代码,直到遇到break。如下图所示。
此外,还可以使用枚举量作为标签,如下所示:
不过,要注意的是,switch是专门设计来面对这种情况的,相比if else效率更高。但是如果要判断的项包含取值范围、浮点测试,或者两个量的比较等等,就只能使用if else了。
区别break和continue:如下图所示,两者都能掉过部分代码,其中break用在switch或任何循环中,作用是跳出switch或循环,而continue用在循环中,作用是跳过本语句后面的循环体内容,直接进入下一循环的判断。
如下所示,两者的功能可谓泾渭分明。
7、文件输入输出
这里的文件I\O指控制台I\O,即只适用处理文本文件。
下面是一个文件输出操作:按照书中的例子,确实能生成目标txt文本文件,同时将内容输出到该文件中。
首先,想要处理文件,需要先包含头文件
其中,头文件里有一个处理文本输出的类ofstream
所以,使用该类创建一个ofstream对象,名字随便取,比如outFile
然后,使用该对象的open(“文件名以及路径”)方法,将该输出对象与文件关联在一起。(若该文件不存在,则主动创建该文件;若已经存在,则默认丢弃原有内容,重新开始,当然这种默认方式可以修改)
接下里,就可以使用该对象和<<来输出各种数据到文本里面了(也就是可以当做cout来使用这个对象)
最后,使用.close关闭该对象关联的文件,如果忘记关了,那么文件会在程序终结时自动关闭。
加下来是读取文件操作:
同样,首先,包含头文件fstream
然后,使用该文件里的类ifstream创建一个对象
接着,使用open()方法将该对象与文件关联起来
然后,可以使用该对象和>>操作读取各种数据,或者可以像cin一样使用get或者getline方法一个字符或者一行字符串。(就是可以直接当做cin来使用,不过不是读取键盘字符,而是读取文件的内容)
可以使用eof()、fail()来判断是否输入成功
最后使用完了之后,调用close关闭文件。
注意:最后一次读取遇到EOF,那么eof()方法将返回true,如果是遇到类型不匹配,那么fail方法就会返回true。如果读取文件是,文件受损或硬件故障,则bad()方法将返回true。但若不区分的话,直接使用good()方法,表示不出任何错误时返回true。