bool类型
bool只有true和false;在C语言中0是false,其他情况(非0)都为true
在.c文件中需要引入头文件 #include< stdbool.h>;在.cpp文件中直接使用
注意:VS2012不完全支持C99标准,不能引入头文件stdbool.h 但是文件后缀名为.cpp可以直接使用bool类型
也可以自己构造bool类型:
关系表达式,运算结果是bool值
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,< <= > >=的优先级相同,高于== 和!=, = =和!=的优先级相同。
需要特别注意:= =才表示等于比较,而=表示赋值,大家要注意区分,切勿混淆
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
int d=a<b<c;//为1(真)
printf("%d\n",d);
return 0;
}
打印结果为1
但是不建议这样写代码
逻辑表达式,运算结果是bool值
1、与运算(&&): 截断与(简洁与)
参与运算的两个表达式都为真时,结果才为真,否则为假
2、或运算(||): 截断或(简洁或)
参与运算的两个表达式只要有一个为真,结果为真;两个表达式都为假结果才为假
3、非运算(!):
参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真
优先级
逻辑运算符和其他运算符优先级从低到高依次为:
赋值运算符(=) < && 和 || < 关系运算符 < 算术运算符< 非(!)
&& 和||低于关系运算符,!高于算术运算符
按照运算符的优先顺序可以得出
分支语句
对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样把程序设计分析与语言分开,使得问题简单化,易于理解。
一对花括号就是一个代码块
没有{},代码紧凑但不直观。代码风格不良。不管是一条语句还是多条语句都使用{}括起来 加上{}代码风格良好
使用单分支语句
三目运算符
多分枝语句 if else
判别键盘输入字符的类别,是否是数字字符,是否是小写字符,是否是大写字符,还有其他字符
改进代码
if嵌套if
if语句嵌套时,要注意if和else的配对问题。C语言规定,else总是与它前面最近的if配对
常见错误:
1、
if(age>=60)加了一个分号;
变成空语句
2、
应改成 age==3
3、
没有加花括号{},if语句默认包含tmp=x;而已
4、
在C语言中,应写成age>16&&age<28
switch多分支结构
switch是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的if else语句
基本格式如下:
(switch,case,break和default都是关键字)
当变量表达式所表达的值与其中一个case语句中的常量值相符时,就执行此case语句后面的程序,并依次去执行后面所有case语句中的程序,除非遇到break语句跳出switch为止;也就是说,整个switch执行结束了,接着会执行整个switch后面的代码。如果常量表达式的量与所有case语句的常量都不相符,就执行default语句中的程序
所有的任何switch语句都必须遵循以下规则:
1、只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句
2、switch()的参数类型不能为浮点数、字符串(必须是整型类型)
3、case标签必须是常量表达式,如42或者‘4’+20
4、case标签必须是唯一常量;也就是说,不允许两个case具有相同的常量值
1、case后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量
2、default不是必须的。当没有default时,如果所有case都匹配失败,那么在switch中就什么都不执行,接着执行后续代码。
输入的是大写的ABCDE,如果我们输入小写的abcde或大写的ABCDE,也能输出相应的分数区间。请改下代码
上述两种方法均不能实现
办法是:
1、
2、
3、
最简便方法
函数初步:自定义函数和库函数
在结构化程序设计中,函数是将任务进行模块划分的基本单位。通过函数,可以把一个复杂任务分解成若干个易于解决的小任务。充分体现结构化程序设计由粗到精,逐步细化的设计思想。一个大的程序一般分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在C语言中子程序用函数实现
函数按其是否系统预定义分为两类:
一类是编译系统预定义的,称为库函数或标准库,如一些常用的数字计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。这些库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。
另一类是用户自定义函数,用户可以根据需要将某个具有相对独立功能的程序定义为函数。
自定义函数有 函数返回类型+函数名+形参列表+函数体构成;
定义函数时可能会涉及若干个变量,究竟哪些变量应当作为函数的参数?哪些应当定义在函数体内?这有一个原则:
作为一个相对独立的模块,函数在使用时完全可以被看成“黑匣子”,除了输入输出外,其他部分可不必关心。从函数的定义看出,函数头正是用来反映函数的功能和使用接口,它所定义的是“做什么”,在这部分必须明确“黑匣子”的输入输出部分,输出就是函数的返回值,输入就是参数。因此,只有那些功能上起自变量作用的变量才必须作为参数定义在参数表中;函数体中具体描述“如何做”,因此参数之外的为实现算法所需用的变量应当定义在函数体内。
C语言中不允许函数的嵌套定义,即在一个函数中定义另一个函数。
1、形式参数(形参):只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参
2、实参(实际参数):调用函数时给出的参数包含了实实在在的数据,所以称为实际参数,简称实参
实参可以是:常量、变量、表达式或函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
3、形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
函数调用首先要进行参数传递,参数传递的方向是由实参传递给形参。传递过程是,先计算实参表达式的值,再将该值传递给对应的形参变量。一般情况下,实参和形参的个数和排列顺序一一对应,并且对应参数应类型匹配(赋值兼容),即实参的类型可以转化为形参类型。而对应参数的参数名则不要求相同。
在示例中int MaxInt(int a,int b),a和b是形参,在main中x,y是实参。
形参和实参的区别和联系
1、形参变量只有在函数调用时才会分配内存(在stack中),调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前赋值、输入等办法使实参获得确定值。
3、实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
4.函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有关系,所以,在函数调用过程中,形参的值发生改变并不会影响实参的值。
函数调用中的内存分配:
函数调用机制
局部变量占用的内存是在程序执行过程中“动态”地建立和释放的。这种“动态”是通过栈由系统自动管理进行的。
当任何一个函数调用发生时,系统都要做以下工作:
1、建立栈空间
2、保护现场:主调函数运行状态和返回地址入栈
3、为被调函数中的局部变量分配空间,完成参数传递
4、执行被调函数函数体
5、释放被调函数中局部变量占用的栈空间
6、恢复现场:取主调函数运行状态及返回地址,释放展开剂
7、继续主调函数后续语句
多文件结构
到目前为止,我们编写的C语言程序都只有一个源文件,没有将代码分散到多个模块中,对于只有几百行的小程序是可以接受,但对于上万行的大中型程序,将所有代码都集中在一个源文件中简直是一场灾难,后续阅读和维护程序都将极为棘手
在C语言中,我们可以将一个 .c文件称为一个模块;所谓模块化开发,是指一个程序包含了多个源文件(.c文件)以及头文件(.h文件)
编译是针对单个文件(.c文件) 的,有多少个源文件就生成多少个目标文件,并且在文件过程中不受其他源文件的影响,每个源文件是独立编译。
函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息,称为函数原型。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。
有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。
循环语句while ,do while, for
while语句
do while语句
for语句
逗号运算符,以及在循环语句中使用
逗号运算符作为C语言中的运算级别最低的一员,逗号运算符结合的方向是从左往右。
逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别计算,但整个表达式的值是最后一个表达式的值。
总结:提供逗号运算符是为了在C语言要求只能有一个表达式的情况下可以使用两个或多个表达式,换句话说,逗号运算符允许将两个表达式“粘贴”在一起构成一个表达式。
空语句: 返回
while语句中,如果在圆括号后放置分号,会产生无限循环:
另一种可能是循环终止,但是在循环终止后只执行一次循环体语句
for语句中,如果在圆括号后放置分号,会导致只执行一次循环体语句
跳转语句break,continue,goto,return
break:
编写一个函数,判断某个整型数值是否是素数
函数要有输入和输出。输入一个整型数据,返回真与假
continue
goto
return