五.运算符5.1算数运算符C语言提供的算数运算符 、- 、 * 、 / 、% 、 如(float、double不能取余)例如 int a 15,b 8,c; double x 15, y 8 ,z; c a b; c a - b; c a * b; c a/b; c a % b; z x y; z x - y; z x * y; z x / y; z x % y;5.2关系运算符C语言的关系运算符如下例如 int a5,b6; a(b-1) 结果为0 (a1)b 结果为1 a(b-2) 结果为1 a100 结果为1 (a3)b 结果为0 a!(b-1) 结果为05.3逻辑运算符逻辑运算符 “” 运算符的运算律如下逻辑与 “” 运算符的运算规律如下短路特性-逢0截止例如 int x5,y18; (x5)(y20) 结果为1 ((x1)0)(y17) 结果为0 ((x-8)0)(y18) 结果为0 ((x-5)0)(y!18) 结果为0 ((x5))||(y20) 结果为1 ((x1)0)||(y17) 结果为1 ((x-8)0)||(y18) 结果为1 ((x-5)0)||(y!8) 结果为1逻辑或 ”||“ 运算符的运算规律如下短路-逢1截止5.4位运算C语言的位运算如下例如 unsigned char x 0x17,y; y ~x;位运算与 ”“ 运算符的运算规律如下例如 unsigned char x0126,y0xac,z; z x y;位运算与 ”| 运算符的运算规律如下例如 unsigned char x076,y0x89,z; z x | y;位逻辑异或”^“运算符的运算规律如下相同为假不同为真例如 unsigned char x75,y0173,z; z x^y;位运算的一般形式运算量 运算量表达式其中 运算量必须为整形结果数值运算符为左移或右移运算符表达式也必须为整形结果数值例如 unsigned char a 0xe4,b; b a3;如何快速把一个无符号位快速置1或者置05.5赋值运算符赋值运算符为”“其运算的一般形式如下左值表达式 右值表达式赋值复合运算符其运算的一般形式如下变量 操作符 表达式C语言的赋值复合运算符如下例如 #include stdio.h int main() { int count,sum; count 0,sum 0; while(count 20) { sumcount;// sum sum count; } printf(sum %d\n,sum); return 0; }5.6特殊运算符” “是三目运算符其运算的一般形式是表达式1 表达式2:表达式3例如 int x82,y 101; x y ? x18: y- 100 //运算结果为1 x (y-11) ? x-22:y-1 //运算结果为60 例如 int main() { int x,y 25; x 70; y x 70?100:0; printf(x %d y %d \n,x,y); return 0; }5.6.2逗号运算符float x 10.5 ,y1.8 ,z 0; z (x 5,y x0.2); z (xy5,x1); z (x5,y6,xy); z (z8,x5,y3);5.6.3 sizeof运算符运算符的一般形式sizeof类型或变量名注意它只针对数据类型而不针对变量例如sizeof(double) sizeof(long)5.6.4 C运算符的优先级例如int x 1,y0,z0; x y || z ; //结果为 12 1 1 !(x1 0) y || z;//结果为1 (1 0 1) xyz,yx2,z xyz0;//x为2y为4六.输入输出6.1数据输出C语言无I/O语句I/O操作由函数实现#include stdio.h字符输出函数格式putchar(c)参数c为字符常量变量或者表达式功能把字符c输出到显示器中返回值正常为显示的代码值#include stdio.h int main() { int c; char a; c65;aB; putchar(c);putchar(\n);putchar(a); } 运算结果为: A B6.2格式输出函数格式printf”格式控制符“输出表功能按指定格式向显示器输出数据输出表要输出的数据格式控制串包含两种信息格式说明 % [修饰符]格式字符用于指定输出格式普通字符原样输出附加格式说明符例1 int a 1234; float f 123.456; char cha; printf(%8d%2d \n,a,a); printf(%f,%8f,%8.1f,%.2f\n,f,f,f,f); printf(%3c \n,c); 例2 static char a[] hello,world!; printf(%s\n %15s\n %10.5s\n %2.5s\n %.3s\n,a,a,a,a,a); 运行结果 例3 int a 1234; float f 123.456; printf(%08d \n,a); printf(%010.2f \n,f); printf(%08d\n,a); printf(%010.2f,f);6.3字符输入函数字符输入函数getchar格式getchar()功能从键盘一字符返回值正常返回读取的代码值出错或结束返回-16.4格式输入函数格式scanf“格式控制串”地址表功能按指定格式从键盘读入数据存入地址表指定存储单元中并按回车键结束返回值正常返回输入数据个数地址表变量的地址常用取地址运算符目前scanf支持的格式字符很多比如scanf函数支持的说明符可以带以下修饰符例1 scanf(%4d%2d%2d,aa,bb,cc) 若输入19991225 则aa为1999bb为12,cc为25 例2 scanf(%2d %*3d%2d,a,b) 若输入1234567 则a为12b为78说明用%c格式符时空格和转义字符作为有效字符输入scanf(%c%c%c,c1,c2,c3); 若输入a b c 则C1为aC2为空格C3为b总结输入数据的时候遇到以下情况认为该函数结束遇到空格TAB或回车遇非法输入遇宽度结束使用输入函数可能会留下垃圾 int x; char ch; scanf(%d,x); scanf(%c,ch) printf(x %d ch %c \n,x,ch);方法1用getchar清除方法2用格式串中空格或“%*c”来 吃掉6.6字符串输入输出函数6.6.1字符串输入函数gets格式char * gets(char *s)功能从键盘输入一以回车结束的字符串放入字符数组中并自动加 ‘\0’说明1输入串长度应小于字符数组维数说明2与scanf函数不同gets函数并不以空格作为字符串输入结束的标志6.6.2字符串输出函数put格式int puts(const char *s)功能向显示器输出字符串输出完换行说明字符数组必须以‘\0’结束七.控制语句7.1 if-else语句if语句概述if(表达式) 语句块1 else 语句块2常见形式简化形式if(表达式)语句块例如 if(xy) printf(%d,x); 阶梯形式 if(表达式1) 语句块1 else if (表达式2) 语句块2 else if表达式3 语句块3 else if (表达式4) 语句块4嵌套形式ifif 语句1else 语句2elseif() 语句3else 语句4注意1. 语句块当有若干条语句的时候必须用{... ...}括号起来2. 表达式1. 一般情况下为逻辑表达式或关系表达式如if(ab xy) printf(%d,x);2. 也可以是任意类型包括整形实型字符型指针类型1. 如: if (a) printf(%d,a);3. 请区分if(x1)和 if(1x)的不同7.2 switch语句多分支选择结构switch(表达式) { case 常量表达式1 语句块1 break; case 常量表达式2 语句块2 break; case 常量表达式n: 语句块n break default 语句块n1 }switch语句的使用每个常量表达式的值必须各不相同否则将出现矛盾当表达式的值与case后面的常量表达式的值相等时就执行case后面的语句。switch中的表达式可以是整形字符型表达式或枚举。case 常量只起语句标号的作用break语句用于强行跳出switch体一般每个case后面应有一个break语句defalut分支后的break可以省略多个case可以执行一条语句int main() { int tmp 1; switch(tmp) { case 1: printf(1\n); break; case 2: printf(2\n); break; case 3: printf(3\n); break; default: printf(not 1 2 3\n); } return 0; }7.3循环语句循环程序语句7.3.1 goto如何使用go to来完成1-100的求和 int main() { int i1,sum 0; loop: if(i100) { sumsumi; i; goto loop; } printf(%d \n,sum); return 0; }当程序有多个出口使用goto把这些出口集中到一处很方便特别是函数中有很多重复的工作的时候。理由是无条件跳转易于理解可以减少嵌套可以避免那些忘记更新某一个出口点的问题算是帮助了编译器做优化7.3.2 whilewhile语句构成循环基本形式 while(表达式) { statements; }循环条件1.变量初值2.终止条件3.变量变化例子1-100的求和7.3.3 do-whiledo-while构成循环基本形式do{ statements; }while(表达式) 例子1-100的求和7.3.4 for一般形式for(expression1;expressiojn2;expression3) { statements; }执行过程1. 先求解表达式1初始值。2. 求解表达式2若为真则执行循环体然后执行步骤三若为假则执行步骤53. 求解表达式34. 转回执行步骤25. 执行for下面的语句例子,1-100的求和 for(i1;i100;i) { sumsumi; }for语句构成循环表达式1可以省略但循环之前应要给循环变量赋值表达式2可以省略将陷入死循环表达式3可以省略但在循环体中增加循环使变量的值改变的语句题目打印九九乘法表7.4辅助控制语句7.4.1 break用于从循环体内跳出一层循环体即提前结束循环break只能用在循环语句和switch语句中。for(r1;r10;r) { areapi*r*r; if(area100) break; printf(%f,area); }7.4.2 continue结束本次循环接着判定下一次是否执行循环注意break和continue的区别continue直结束本次循环而break终止本层循环for(n100;n200;n) { if(n%3 0) { continue; } printf(%d\n,n); }7.4.3 returnreturn语句的一般形式return(表达式)主要用于终止包含它的函数的执行若终止的为主函数则主程序结束八.数组8.1一维数组构造数据类型之一数组是具有一定顺序关系的若干个变量的集合组成数组的各个变量称为数组的元素数组中各元素的数据类型要求相同用数组名和下标确定数组可以是一维的也可以是多维的。8.1.1一维数组的定义1. 所谓一维数组是指只有一个下标的数组它在计算机的内存中是连续存储的。2. C语言中一维数组的说明一般形式如下存储类型 数据类型 数组名[表达式]例如int a[6]:数组名表示内存首地址是地址常量。sizeof(数组名)是数组占用的总内存空间编译时分配连续的内存内存字节数数组维数*sizeof(元素数据类型)注意事项C语言对数组不作越界检查使用时候要注意int a[5]; a[5] 10;关于用变量定义数组维数int i 15; int a[i];8.1.2一维数组的引用数组必须先定义再使用只能逐个引用数组元素不能一次引用整个数组数组元素表示形式 数组名[下标]其中下标可以是常量或者 整形表达式例如 int a[10]; printf(%d,a); //错误写法 for(i0;i10;i) printf(%d,a[i]); //正确写法8.1.3一维数组的初始化1. 初始化方式在定义数组的时候为数组元素赋初值int a[5] {1,2,3,4,5};2. 说明1. 数组不初始化其元素值为随机数2. 对static数组元素不赋初值系统会自动赋以03. 只给部分数组元素赋初值题目冒泡排序它重复的走访过要排序的数列一次比较两个元素如果顺序错误就交换。走访数列的工作是重复的进行直到没有再需要交换,也就是说数列已经排序完成。8.2二维数组8.2.1二维数组的定义定义方式声明时列数不能省略行数可以数据类型 数组名[常量表达式][常量表达式] 例如 int a[3][4]; float b[2][5]; int c [2][3][4];元素个数 行数*列数8.2.2二维数组的存放顺序原因内存是一维的二维数组按行序优先二维数组a是由 三个元素组成 a[0]、a[1]、a[2]每个元素a[i] 由包含2个元素的一维数组组成8.2.3二维数组的引用形式 数组名[下标][下标] 二维数组元素的初始化 1.分行初始化 2.按元素排列顺序初始化 例如 int a[2][3] {{1,2,3},{4,5,6}}; a[0][0]、a[0][1]、a[0][2]、 a[1][0]、a[1][1]、a[1][2] 例如 int a[][3]{{1},{4,5}}; //一维数组的长度省略8.3多维数组具有两个或者两个以上下标的数组称为多维数组。int c[2][3][4] c[0][0][0]、c[0][0][1]、c[0][0][2]、c[0][0][3] c[0][1][0]、c[0][1][1]、c[0][1][2]、c[0][1][3] c[0][2][0]、c[0][2][1]、c[0][2][2]、c[0][2][3] c[1][0][0]、c[1][0][1]、c[1][0][2]、c[1][0][3] c[1][1][0]、c[1][1][1]、c[1][1][2]、c[1][1][3]
C语言从入门到进阶 第二次笔记
发布时间:2026/5/18 22:33:04
五.运算符5.1算数运算符C语言提供的算数运算符 、- 、 * 、 / 、% 、 如(float、double不能取余)例如 int a 15,b 8,c; double x 15, y 8 ,z; c a b; c a - b; c a * b; c a/b; c a % b; z x y; z x - y; z x * y; z x / y; z x % y;5.2关系运算符C语言的关系运算符如下例如 int a5,b6; a(b-1) 结果为0 (a1)b 结果为1 a(b-2) 结果为1 a100 结果为1 (a3)b 结果为0 a!(b-1) 结果为05.3逻辑运算符逻辑运算符 “” 运算符的运算律如下逻辑与 “” 运算符的运算规律如下短路特性-逢0截止例如 int x5,y18; (x5)(y20) 结果为1 ((x1)0)(y17) 结果为0 ((x-8)0)(y18) 结果为0 ((x-5)0)(y!18) 结果为0 ((x5))||(y20) 结果为1 ((x1)0)||(y17) 结果为1 ((x-8)0)||(y18) 结果为1 ((x-5)0)||(y!8) 结果为1逻辑或 ”||“ 运算符的运算规律如下短路-逢1截止5.4位运算C语言的位运算如下例如 unsigned char x 0x17,y; y ~x;位运算与 ”“ 运算符的运算规律如下例如 unsigned char x0126,y0xac,z; z x y;位运算与 ”| 运算符的运算规律如下例如 unsigned char x076,y0x89,z; z x | y;位逻辑异或”^“运算符的运算规律如下相同为假不同为真例如 unsigned char x75,y0173,z; z x^y;位运算的一般形式运算量 运算量表达式其中 运算量必须为整形结果数值运算符为左移或右移运算符表达式也必须为整形结果数值例如 unsigned char a 0xe4,b; b a3;如何快速把一个无符号位快速置1或者置05.5赋值运算符赋值运算符为”“其运算的一般形式如下左值表达式 右值表达式赋值复合运算符其运算的一般形式如下变量 操作符 表达式C语言的赋值复合运算符如下例如 #include stdio.h int main() { int count,sum; count 0,sum 0; while(count 20) { sumcount;// sum sum count; } printf(sum %d\n,sum); return 0; }5.6特殊运算符” “是三目运算符其运算的一般形式是表达式1 表达式2:表达式3例如 int x82,y 101; x y ? x18: y- 100 //运算结果为1 x (y-11) ? x-22:y-1 //运算结果为60 例如 int main() { int x,y 25; x 70; y x 70?100:0; printf(x %d y %d \n,x,y); return 0; }5.6.2逗号运算符float x 10.5 ,y1.8 ,z 0; z (x 5,y x0.2); z (xy5,x1); z (x5,y6,xy); z (z8,x5,y3);5.6.3 sizeof运算符运算符的一般形式sizeof类型或变量名注意它只针对数据类型而不针对变量例如sizeof(double) sizeof(long)5.6.4 C运算符的优先级例如int x 1,y0,z0; x y || z ; //结果为 12 1 1 !(x1 0) y || z;//结果为1 (1 0 1) xyz,yx2,z xyz0;//x为2y为4六.输入输出6.1数据输出C语言无I/O语句I/O操作由函数实现#include stdio.h字符输出函数格式putchar(c)参数c为字符常量变量或者表达式功能把字符c输出到显示器中返回值正常为显示的代码值#include stdio.h int main() { int c; char a; c65;aB; putchar(c);putchar(\n);putchar(a); } 运算结果为: A B6.2格式输出函数格式printf”格式控制符“输出表功能按指定格式向显示器输出数据输出表要输出的数据格式控制串包含两种信息格式说明 % [修饰符]格式字符用于指定输出格式普通字符原样输出附加格式说明符例1 int a 1234; float f 123.456; char cha; printf(%8d%2d \n,a,a); printf(%f,%8f,%8.1f,%.2f\n,f,f,f,f); printf(%3c \n,c); 例2 static char a[] hello,world!; printf(%s\n %15s\n %10.5s\n %2.5s\n %.3s\n,a,a,a,a,a); 运行结果 例3 int a 1234; float f 123.456; printf(%08d \n,a); printf(%010.2f \n,f); printf(%08d\n,a); printf(%010.2f,f);6.3字符输入函数字符输入函数getchar格式getchar()功能从键盘一字符返回值正常返回读取的代码值出错或结束返回-16.4格式输入函数格式scanf“格式控制串”地址表功能按指定格式从键盘读入数据存入地址表指定存储单元中并按回车键结束返回值正常返回输入数据个数地址表变量的地址常用取地址运算符目前scanf支持的格式字符很多比如scanf函数支持的说明符可以带以下修饰符例1 scanf(%4d%2d%2d,aa,bb,cc) 若输入19991225 则aa为1999bb为12,cc为25 例2 scanf(%2d %*3d%2d,a,b) 若输入1234567 则a为12b为78说明用%c格式符时空格和转义字符作为有效字符输入scanf(%c%c%c,c1,c2,c3); 若输入a b c 则C1为aC2为空格C3为b总结输入数据的时候遇到以下情况认为该函数结束遇到空格TAB或回车遇非法输入遇宽度结束使用输入函数可能会留下垃圾 int x; char ch; scanf(%d,x); scanf(%c,ch) printf(x %d ch %c \n,x,ch);方法1用getchar清除方法2用格式串中空格或“%*c”来 吃掉6.6字符串输入输出函数6.6.1字符串输入函数gets格式char * gets(char *s)功能从键盘输入一以回车结束的字符串放入字符数组中并自动加 ‘\0’说明1输入串长度应小于字符数组维数说明2与scanf函数不同gets函数并不以空格作为字符串输入结束的标志6.6.2字符串输出函数put格式int puts(const char *s)功能向显示器输出字符串输出完换行说明字符数组必须以‘\0’结束七.控制语句7.1 if-else语句if语句概述if(表达式) 语句块1 else 语句块2常见形式简化形式if(表达式)语句块例如 if(xy) printf(%d,x); 阶梯形式 if(表达式1) 语句块1 else if (表达式2) 语句块2 else if表达式3 语句块3 else if (表达式4) 语句块4嵌套形式ifif 语句1else 语句2elseif() 语句3else 语句4注意1. 语句块当有若干条语句的时候必须用{... ...}括号起来2. 表达式1. 一般情况下为逻辑表达式或关系表达式如if(ab xy) printf(%d,x);2. 也可以是任意类型包括整形实型字符型指针类型1. 如: if (a) printf(%d,a);3. 请区分if(x1)和 if(1x)的不同7.2 switch语句多分支选择结构switch(表达式) { case 常量表达式1 语句块1 break; case 常量表达式2 语句块2 break; case 常量表达式n: 语句块n break default 语句块n1 }switch语句的使用每个常量表达式的值必须各不相同否则将出现矛盾当表达式的值与case后面的常量表达式的值相等时就执行case后面的语句。switch中的表达式可以是整形字符型表达式或枚举。case 常量只起语句标号的作用break语句用于强行跳出switch体一般每个case后面应有一个break语句defalut分支后的break可以省略多个case可以执行一条语句int main() { int tmp 1; switch(tmp) { case 1: printf(1\n); break; case 2: printf(2\n); break; case 3: printf(3\n); break; default: printf(not 1 2 3\n); } return 0; }7.3循环语句循环程序语句7.3.1 goto如何使用go to来完成1-100的求和 int main() { int i1,sum 0; loop: if(i100) { sumsumi; i; goto loop; } printf(%d \n,sum); return 0; }当程序有多个出口使用goto把这些出口集中到一处很方便特别是函数中有很多重复的工作的时候。理由是无条件跳转易于理解可以减少嵌套可以避免那些忘记更新某一个出口点的问题算是帮助了编译器做优化7.3.2 whilewhile语句构成循环基本形式 while(表达式) { statements; }循环条件1.变量初值2.终止条件3.变量变化例子1-100的求和7.3.3 do-whiledo-while构成循环基本形式do{ statements; }while(表达式) 例子1-100的求和7.3.4 for一般形式for(expression1;expressiojn2;expression3) { statements; }执行过程1. 先求解表达式1初始值。2. 求解表达式2若为真则执行循环体然后执行步骤三若为假则执行步骤53. 求解表达式34. 转回执行步骤25. 执行for下面的语句例子,1-100的求和 for(i1;i100;i) { sumsumi; }for语句构成循环表达式1可以省略但循环之前应要给循环变量赋值表达式2可以省略将陷入死循环表达式3可以省略但在循环体中增加循环使变量的值改变的语句题目打印九九乘法表7.4辅助控制语句7.4.1 break用于从循环体内跳出一层循环体即提前结束循环break只能用在循环语句和switch语句中。for(r1;r10;r) { areapi*r*r; if(area100) break; printf(%f,area); }7.4.2 continue结束本次循环接着判定下一次是否执行循环注意break和continue的区别continue直结束本次循环而break终止本层循环for(n100;n200;n) { if(n%3 0) { continue; } printf(%d\n,n); }7.4.3 returnreturn语句的一般形式return(表达式)主要用于终止包含它的函数的执行若终止的为主函数则主程序结束八.数组8.1一维数组构造数据类型之一数组是具有一定顺序关系的若干个变量的集合组成数组的各个变量称为数组的元素数组中各元素的数据类型要求相同用数组名和下标确定数组可以是一维的也可以是多维的。8.1.1一维数组的定义1. 所谓一维数组是指只有一个下标的数组它在计算机的内存中是连续存储的。2. C语言中一维数组的说明一般形式如下存储类型 数据类型 数组名[表达式]例如int a[6]:数组名表示内存首地址是地址常量。sizeof(数组名)是数组占用的总内存空间编译时分配连续的内存内存字节数数组维数*sizeof(元素数据类型)注意事项C语言对数组不作越界检查使用时候要注意int a[5]; a[5] 10;关于用变量定义数组维数int i 15; int a[i];8.1.2一维数组的引用数组必须先定义再使用只能逐个引用数组元素不能一次引用整个数组数组元素表示形式 数组名[下标]其中下标可以是常量或者 整形表达式例如 int a[10]; printf(%d,a); //错误写法 for(i0;i10;i) printf(%d,a[i]); //正确写法8.1.3一维数组的初始化1. 初始化方式在定义数组的时候为数组元素赋初值int a[5] {1,2,3,4,5};2. 说明1. 数组不初始化其元素值为随机数2. 对static数组元素不赋初值系统会自动赋以03. 只给部分数组元素赋初值题目冒泡排序它重复的走访过要排序的数列一次比较两个元素如果顺序错误就交换。走访数列的工作是重复的进行直到没有再需要交换,也就是说数列已经排序完成。8.2二维数组8.2.1二维数组的定义定义方式声明时列数不能省略行数可以数据类型 数组名[常量表达式][常量表达式] 例如 int a[3][4]; float b[2][5]; int c [2][3][4];元素个数 行数*列数8.2.2二维数组的存放顺序原因内存是一维的二维数组按行序优先二维数组a是由 三个元素组成 a[0]、a[1]、a[2]每个元素a[i] 由包含2个元素的一维数组组成8.2.3二维数组的引用形式 数组名[下标][下标] 二维数组元素的初始化 1.分行初始化 2.按元素排列顺序初始化 例如 int a[2][3] {{1,2,3},{4,5,6}}; a[0][0]、a[0][1]、a[0][2]、 a[1][0]、a[1][1]、a[1][2] 例如 int a[][3]{{1},{4,5}}; //一维数组的长度省略8.3多维数组具有两个或者两个以上下标的数组称为多维数组。int c[2][3][4] c[0][0][0]、c[0][0][1]、c[0][0][2]、c[0][0][3] c[0][1][0]、c[0][1][1]、c[0][1][2]、c[0][1][3] c[0][2][0]、c[0][2][1]、c[0][2][2]、c[0][2][3] c[1][0][0]、c[1][0][1]、c[1][0][2]、c[1][0][3] c[1][1][0]、c[1][1][1]、c[1][1][2]、c[1][1][3]