(2):当一个逻辑语句一定成立时,后续部分将不执行
true||(逻辑或)任何值都是true 所以i++部分不必要做,i仍然等于3。同理可以推广到&&(逻辑与)中。
(3)所有非0的数字(因为字符是以ASCII码存储的,所以也能看成数字)都将被映射成1。
13:条件运算符“?:”
(1) 它是唯一的一个三目运算符
(2) 它只完成符合条件的那一项分支,不符合条件的语句不会执行。
注意条件运算符于逗号表达式的混合使用。
14:关于switch语句
(1) 格式 switch(n) {
case 常量表达式1 :语句1; case 常量表达式2 :语句2; case 常量表达式3 :语句3; default : 语句4; }
(2)其中 n只能是int型 char型 bool型 和枚举型(目前不考虑),这个意思就是,n
不能为float型。(这里书上没有写清楚,试验了一下是这样的)
(3)default可以省略,default的触发条件是n与所有常量表达式无匹配。
(4)case语句执行以后,如果没有遇到break;就会继续往下执行并且可以从case语句执行到default语句。
15:关于循环语句:
(1)无论是while do-while for语句,如果不加花括号,那么他们只能影响到他们下一句话。
(2)for(表达式1;表达式2;表达式3)语句中的三个表达式均可以省略,其中第二个表达式省略的默认值是1 而不是0。即for(;;)=while(true)。 (3)注意continue 和break的区别,continue是强制终止本次循环并进行下一次,而break是强制跳出当前循环体,当有多个循环嵌套语句时跳出的循环体为包含break的最小的循环体。
16:关于函数
(1):一个函数可以有多个return 语句(如果返回类型不是void的话),并且只要有一个return 语句执行,那么整个函数就执行完毕剩余部分将不再执行。
(2)函数不能嵌套定义,即一个函数内部不能有完整的定义另外一个函数的语句块。 (3)函数可以自我调用,详情参照递归。
(4)函数的参数只要不是引用或者是指针(即传址参数),那么实参的值就不会改变。 (5)函数在执行之前必须被定义或者申明。函数在申明时,可以不写参数,只写参数类型,并且在给默认值时,可以以这种形式
。我们推荐函数默认值在
申明中设置。
(6)函数的默认值只能设置一次,如果在申明和定义中都设置了默认值(不管相不相同),在编译的时候都会报错。并且默认值的设置必须从右向左,中间不能间断。
(7)避免函数的重复定义,或者是意义不清的重载
引起歧义的重载函数
(8)当函数的参数列表是表达式时,按照自右向左的顺序执行(最起码在VC++和GCC编译器是这样的)
这时,函数的参数列表是f(4,3)。
(9)函数重载:
函数重载的要求是对于一个同名的函数,参数列表(个数,类型,顺序)至少有一项不同。否则就会出现编译系统无法判断到底是重载哪个函数。如图:
特别注意:对函数的申明和定义不是同一回事,申明就是告诉编译系统有这么长一个样子的函数,它的返回类型,参数列表是怎么样的。系统在检查声明时,并不会去检查函数的具体实现。而定义则是要写出函数要实现的目标的语句。
17:关于变量的生命周期和作用域
(1) 局部变量与全局变量的概念
定义在函数外部的变量,如图中的c,即使全局变量,而在函数内部定义的变量如a既是局部变量。局部变量未初始化为随机值,而全局变量未初始化为0或’\\0’。并且全局变量无论放在main函数的上下方,都在程序一开始执行时就被定义。但是却无法在其生存期之外的地方使用。下面介绍 (2) 关于重复定义和屏蔽效应
被重复定义的变量一定是处于同一语句块中
与上图相比,int a=1上下少了花括号,这样就会报给语法错误重复定义。
而屏蔽效应则是发生在不同语句块之间 如之前的那张图。在最内部的语句块a=1,此处的a把上面的a=0的a给屏蔽了,并且这两个a不是同一个。
(3)动态存储的(auto)变量与静态存储的(static)变量以及它们的生命期 自动变量由关键字(auto)决定,在未写关键字时,默认为自动变量。 静态局部变量由关键字(static)决定。
自动变量存储在栈空间中,随着栈空间的建立和销毁而建立销毁。
静态局部变量只在最开始定义一次,存储在全局变量区中,并且从定义开始一直生存到程序结束。
(4)不是特别重要的register(寄存器)变量和extern(外部)变量
寄存器变量就是讲变量存储在寄存器(cache)中,以便在多次使用时,能更快的完成。
要注意的是,register关键字不是强制性指令,而是建议性指令,计算机可以不遵守。并且,当计算机认为这个变量需要被使用多次时,会自动的将其作为寄存器变量来使用。 当全局变量被定义在main函数下方时,由于生命期的限制,全局函数不能在main函数中使用,这时,我们需要在main函数中加上extern关键字来申明外部变量。
也就是说,如果改成了extern float c; 那么编译器就会报错
静态外部变量,与普通外部变量基本相同,只不过这个变量不能被别的文件所使用。
特别的:说一下运算符”::”,表示该变量为全局变量而不是由可见性导致的局部变量。
18:预处理命令(不是重点)
由于预处理命令都是在程序开始运行之前执行的步骤,所以要在开头加上#并且尾部没有; (1) 宏命令
#define 标识符(宏名) 字符串 #define 宏名+(参数列表) 字符串
即在程序运行之前,将所有的标识符用字符串替代。由于const 关键字的存在,这个命令的实用性不是很大。
如#define PI 3.1415926 在下文出现的PI均以3.1415926代替。 如#define s(r)3.14*r*r
则在下面运行area=s(r) 时,相当于运行area=3.14*r*r。
要注意的是,并不是开辟一块空间并命名为宏名,然后对其进行赋值。而是用右边的字