C语言个人学习笔记
1.字符类型数据类型的作用编译器预算对象变量分配的内存空间大小。ASCII码数据类型char字符 char c36是错误的单引号里面的字符必须是一个bool类型两种初始化ture和falsescanf用键盘输入进行初始化整型%d小数%f字符%c输入一定要加取地址符输出%d,a/b 有小数向下取整printf(%d,a/b)是整数如果想要小数那就改成printf(%f,a/b)就可以了吗非也在c语言中两个整数a和b相除一定是整数可以这样写printf(%f,a*1.0/b)a是整数乘1.0之后就会变成float型只要除数和被除数有一方是float型那结果就是小数2.简单的C语言程序程序框架第一行代码表示导入一个头文件stdio.h导入 包含一个头文件 .h是一个头文件 std 标准库i-input o-output 标准输入输出的头文件里面的内容叫字符串{}叫代码块一个代码块内部可以有一条或者多条语句int是一种数据类型表示整型 存储整数 int 是函数的返回值类型main是一个函数是c语言程序主入口程序有且只有一个主函数void是一种数据类型表示空类型return 表示函数的结束0 表示程序正确执行//行注释/**/叫块注释块注释可以注释多行是C语言标准的注释方法\n表示换行是一个转义字符占位符printf()不能直接打印1234因为打印出来的是字符串%d表示输出一个整型数据运算3.变量赋值和初始化可以在一行定义多个变量如 int price,amount;ds和数学不同ab在程序设计中要求计算机做一个动作表示将b的值赋给a初始化i 有一个初始值0最终才可以得10不然会得到很奇怪的值i没定义变量没做初始化i那个位置本身有个值必需给变量初始化类型名称变量名称初始值int price 0;int amount 100;组合变量定义的时候也可以在这个定义中单独给单个变量赋初值如int price 0, amount 100;表达式int price 0变量的名字是price类型是intC语言是一种有类型的语言一旦确定在这个程序里不可改变在C99里定义了第二个变量changeC99允许你在程序的任何地方定义变量只要出现在这个变量第一次使用之前而传统的ANSI C只能在代码开头的地方定义变量scanf输入printf输出最后的 f 是format格式化如何输入输入也在终端窗口中输入是以行的单位进行的行的结束标志就是按下回车键。按下回车键之前你的程序不会读到任何东西4.常量vs变量常量100 大伙可能看不懂但是一看就AMOUNT金额大伙就都明白了而且便于后期修改习惯一般对一个const的变量需要强调说是全大写的如果没有const那就不用consttry让用户输入变量AMOUNT的值而不是使用固定的初始值这个变量在哪里定义合适呢plus.c%d 后面必须有对应的 and出错5.浮点数多次运行后发现英寸未起作用。这是因为两个整数的运算的结果只能是整数如果除后有小数就扔掉小数部分注10和10.0在C中是完全不同的数%d是int%f才是double浮点数带小数点的数值改进doubleinch是定义为int类型的变量如果把int换成double我们就把他改为double类型的浮点数变量了double的意思是“双”它本来是“双精度浮点数”的第一个单词人们用来表示浮点数类型。除了double还有float意思就是浮点表示单精度浮点数。把foot和inch换成double以后的样子对于doublescanf输入的时候用%lf数据类型输入、输出6.表达式求平均值运算符优先级调试先设一个断点当程序走到断点时停下来调试运行F5蓝色指还未执行即将执行将鼠标指针移到变量上就可以显示变量的值复合赋值和递增递减复合赋值递增递减运算符count ;count 1;count count 1;前缀后缀和--可以放在变量的前面或者后面a值就是a加1以前的值而a的值是加了1以后的值无论哪个a自己的值都加了1例子7.判断与循环目录做判断While循环do-while循环for循环做判断根据比较的结果决定做、还是不做某些动作就要用到if语句。一个基本的if语句由一个关键字if开头跟上在括号里的一个表示条件的逻辑表达式然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true那么就执行后面跟着的这对大括号中的语句否则就跳过这些语句不执行而继续下面的其他语句。比较运算成立1不成立0// 是C99的注释/* */是多行注释if(a10)是赋值会被认为做成了if条件通过执行if下面的语句循环While循环验证do-while循环先进循环体再进条件判断定义即先进循环体在判断条件为了解决这种问题第二个程序在x0的时候不适用while在循环进去的时候判断do-while在循环出来的时候判断使用后for循环1.初始条件 2.循环继续的条件 3.循环每轮要做的动作先给i做初始化然后在计数器到达某个值之前重复执行这个循环体每执行一轮循环都会以一定的步径进行调整小套路tips如果有固定次数用for如果必须执行一次用do_while其它情况用while8.进一步的判断与循环目录逻辑类型逻辑运算嵌套和级联的if-else多路分支switch-case逻辑类型bool类型#includestdbool.h逻辑运算逻辑运算结果只有0和1逻辑量是关系运算或逻辑运算的结果如何表达数学中的区间如x ∈ [ 4 , 6 ] or x ∈ ( 4 , 6 )在C语言里4X6 不是C能正确运算的句子因为4 x的结果是一个逻辑值0或1所以结果一定为1Ture正确表达是x 4 x 6 并且理解一下20到30区间index不在0到99范围内! age需要注意单目运算符的优先级高于双目运算符表面看是大于等于20实际上先计算 ! age 如果age是0not age!age就是1如果age是1not age就是0如果想正确表达需要加括号优先级所以可以替换为是并且的意思短路逻辑运算是自左向右计算的如果左侧的计算已经能够决定结果了则不会继续进行右侧的计算不要把赋值包括复合赋值组合进表达式逗号运算逗号的优先级低过赋值所以 i 34, 56; 这个式子会先计算i 3456没有用到如果加括号 i (34, 56); 则是34没有用到i 的值为5611逗号运算主要在for循环中使用嵌套和级联的if-else如果if-else大括号{}里只有一句话则可以省略判断3个数哪个最大else的匹配else总是与最近的那个if进行匹配缩进缩进格式不能暗示else的匹配怎么指定匹配想要 gameover 不等于0的时候输出 else 安全的方式是使用大括号{ }建议就是 if 或 else 后面始终加 { }即使只有一条语句的时候养成良好的编程习惯级联的if-else让所有的else对齐使上一个else和下一个if在一起中间依旧有空格多路分支switch-casetype3 的时候之间从switch跳到case 3干净利落不用判断12控制表达式只能是整数类型的结果int常量可以是常数也可以是常数计算的表达式if语句可以判断一个区间执行效率较低switch 语句执行效率较快不可以进行区间判断break对switch-case来说所有的内容处在相同的空间里case 可以理解为“从哪里开始执行的一个位置”如果在一个case里在下一次case前没有遇到break那就进去无论type是1还是2结果是一样的case是一个“路牌”不能挡住进程三目运算符也叫条件运算符三元运算符如果为真选择值1如果为假选择值2如果ab为真打印a否则打印b结构清晰不适于嵌套8.进一步的判断与循环目录逻辑类型逻辑运算嵌套和级联的if-else多路分支switch-case逻辑类型bool类型#includestdbool.h逻辑运算逻辑运算结果只有0和1逻辑量是关系运算或逻辑运算的结果如何表达数学中的区间如x ∈ [ 4 , 6 ] or x ∈ ( 4 , 6 )在C语言里4X6 不是C能正确运算的句子因为4 x的结果是一个逻辑值0或1所以结果一定为1Ture正确表达是x 4 x 6 并且理解一下20到30区间index不在0到99范围内! age需要注意单目运算符的优先级高于双目运算符表面看是大于等于20实际上先计算 ! age 如果age是0not age!age就是1如果age是1not age就是0如果想正确表达需要加括号优先级所以可以替换为是并且的意思短路逻辑运算是自左向右计算的如果左侧的计算已经能够决定结果了则不会继续进行右侧的计算不要把赋值包括复合赋值组合进表达式逗号运算逗号的优先级低过赋值所以 i 34, 56; 这个式子会先计算i 3456没有用到如果加括号 i (34, 56); 则是34没有用到i 的值为5611逗号运算主要在for循环中使用嵌套和级联的if-else如果if-else大括号{}里只有一句话则可以省略判断3个数哪个最大else的匹配else总是与最近的那个if进行匹配缩进缩进格式不能暗示else的匹配怎么指定匹配想要 gameover 不等于0的时候输出 else 安全的方式是使用大括号{ }建议就是 if 或 else 后面始终加 { }即使只有一条语句的时候养成良好的编程习惯级联的if-else让所有的else对齐使上一个else和下一个if在一起中间依旧有空格多路分支switch-casetype3 的时候之间从switch跳到case 3干净利落不用判断12控制表达式只能是整数类型的结果int常量可以是常数也可以是常数计算的表达式if语句可以判断一个区间执行效率较低switch 语句执行效率较快不可以进行区间判断break对switch-case来说所有的内容处在相同的空间里case 可以理解为“从哪里开始执行的一个位置”如果在一个case里在下一次case前没有遇到break那就进去无论type是1还是2结果是一样的case是一个“路牌”不能挡住进程三目运算符也叫条件运算符三元运算符如果为真选择值1如果为假选择值2如果ab为真打印a否则打印b结构清晰不适于嵌套9.循环控制目录break和continue接力breakgoto前n项求和逆序分解break和continuebreak跳出循环continue跳过循环这一轮剩下的语句进入下一轮还会继续循环但循环剩下的句子就不再做接力break我们要有一个变量exit来表达这件事情但我们要break的时候让那个变量等于1然后在循环外面判断等不等于1再接力breakgotogoto 要跳到“out”所指的地方去前n项求和sum是浮点数所以用double如果是这样呢我们可以在前面先设一个变量sign让他等于1在循环的每一轮我们让sign等于负的sign这样我们可以做到第一次是 1.0 乘以i第二次是 -1.0 乘以i逆序分解先逆序后逆序分解只适用于末尾没有0的数逆序分解10.数组与函数目录定义数组函数传值本地变量关于main二维数组定义一个数组数组里每一个单元都是int数组大小为100先定义 int cnt 0一开始为0数组为number[0]随着cnt循环不断进行对数组中的元素赋值定义数组编译器和运行环境不会检查数组是否越界有效的下标范围[0数组的大小-1]初始化数组之前要定义遍历数组当然前面需要定义count的大小数组要参与运算通常都要用到这些函数定义一个自己的函数在#includestdio.h的下方主函数求和函数void sum(int begin, int end)函数头{ }里面的东西函数体sum 函数名void 返回类型不返回任何结果int begin, int end 参数表调用函数函数名参数值() 起到了表示参数调用的重要作用即使没有参数也需要 ()从函数中返回return 停止函数的执行并返回一个值return;return 表达式;如果现在程序一开始看到main()是怎么执行的想把自己定义的函数放到下面可以在开头加上void sum(int begin, int end); 这行叫做函数的原型声明声明不是函数而且要确保定义与声明类型一致void函数头以“;”为结尾就构成了函数的原型函数原型的目的就是告诉编译器这个函数长什么样子名称参数数量及类型返回类型根据原型判断在这种情况下会发生自动程序转换它会把12转换成double交给a传值每个函数都有自己的变量空间参数也位于这个独立的空间中和其它函数没有关系我们把参数表和原型声明里的void swap(int a, int b);里的叫做参数把调用函数时候swap(a,b);里的叫值本地变量函数的每次运行就形成了一个独立的变量空间在这个空间中的变量是函数这次运行所独有的称作本地变量定义在函数内部的变量就是本地变量参数也是本地变量变量的生存期与作用域规则本地变量是定义在块内的它可以是定义在函数的块内也可以定义在语句的块内下面此时会给出error说i未声明过甚至可以随便拉一个大括号来定义变量程序运行进入这个块之前其中的变量不存在离开这个块其中的变量就消失了块外面定义的变量在里面仍然有效块里面定义了和外面同名的变量则掩盖外面的不能在一个块内定义同名的变量本地变量不会被默认初始化参数在进入函数的时候被初始化了void swap()无参函数编译可以通过意思是告诉编译器不确定swap到底要什么参数如果确定函数没有参数建议写成void swap(void);不要留空f(a,b)在调用函数的时候逗号是符号不是运算符f((a,b))表明要先做括号里的运算这个时候是逗号运算符也就是b与上面的区别就是到底传了两个还是一个参数进去的问题C语言不允许函数嵌套定义int i,j,sum(int a,int b); 不建议这么写在函数定义时函数的参数没有具体的值只有一个数据类型是一个形式上的参数简称形参形参没有具体的值用来接收函数调用时传递过来的实际参数在未出现函数调用时它们并不占内存中的存储单元关于mainint main()也是一个函数return 0; 也有意义如果return非0的值那说明程序有错误echo $?运行echo $?编译成功会返回1如果return -1;编译后运行结果返回255二维数组int a[3][5];在内存里通常理解a是一个3行5列矩阵二维数组的遍历一维用一重循环就可以二维就要用两重循环外面层遍历行号里面层遍历列号a[i][j]是一个int。但是a[i,j]就等于a[j]逗号相当于运算符表示第i行第j列单元二维数组的初始化列数不可以省流但行数可以省略列数是必须给出的行数可以由编译器来数每行一个{}逗号分隔最后的逗号可以存在有古老的传统如果省略表示补零函数的调用产生随机数5要素头文件、函数名字、功能、参数、返回值#include time.htime_ttime(time_t*t);功能获取当前系统时间参数常设置为NULL返回值当前系统时间, time_t 相当于long类型单位为毫秒#include stdlib.hvoid srand(unsigned int seed);功能用来设置rand()产生随机数时的随机种子参数如果每次seed相等rand()产生随机数相等返回值无#include stdlib.hint rand(void);功能返回一个随机数值参数无返回值随机数10.数组与函数定义数组编译器和运行环境不会检查数组是否越界有效的下标范围[0数组的大小-1]初始化数组之前要定义遍历数组当然前面需要定义count的大小数组要参与运算通常都要用到这些函数定义一个自己的函数在#includestdio.h的下方主函数求和函数void sum(int begin, int end)函数头{ }里面的东西函数体sum 函数名void 返回类型不返回任何结果int begin, int end 参数表调用函数函数名参数值() 起到了表示参数调用的重要作用即使没有参数也需要 ()从函数中返回return 停止函数的执行并返回一个值return;return 表达式;如果现在程序一开始看到main()是怎么执行的想把自己定义的函数放到下面可以在开头加上void sum(int begin, int end); 这行叫做函数的原型声明声明不是函数而且要确保定义与声明类型一致void函数头以“;”为结尾就构成了函数的原型函数原型的目的就是告诉编译器这个函数长什么样子名称参数数量及类型返回类型根据原型判断在这种情况下会发生自动程序转换它会把12转换成double交给a传值每个函数都有自己的变量空间参数也位于这个独立的空间中和其它函数没有关系我们把参数表和原型声明里的void swap(int a, int b);里的叫做参数把调用函数时候swap(a,b);里的叫值本地变量函数的每次运行就形成了一个独立的变量空间在这个空间中的变量是函数这次运行所独有的称作本地变量定义在函数内部的变量就是本地变量参数也是本地变量变量的生存期与作用域规则本地变量是定义在块内的它可以是定义在函数的块内也可以定义在语句的块内下面此时会给出error说i未声明过甚至可以随便拉一个大括号来定义变量程序运行进入这个块之前其中的变量不存在离开这个块其中的变量就消失了块外面定义的变量在里面仍然有效块里面定义了和外面同名的变量则掩盖外面的不能在一个块内定义同名的变量本地变量不会被默认初始化参数在进入函数的时候被初始化了void swap()无参函数编译可以通过意思是告诉编译器不确定swap到底要什么参数如果确定函数没有参数建议写成void swap(void);不要留空f(a,b)在调用函数的时候逗号是符号不是运算符f((a,b))表明要先做括号里的运算这个时候是逗号运算符也就是b与上面的区别就是到底传了两个还是一个参数进去的问题C语言不允许函数嵌套定义int i,j,sum(int a,int b); 不建议这么写在函数定义时函数的参数没有具体的值只有一个数据类型是一个形式上的参数简称形参形参没有具体的值用来接收函数调用时传递过来的实际参数在未出现函数调用时它们并不占内存中的存储单元关于mainint main()也是一个函数return 0; 也有意义如果return非0的值那说明程序有错误echo $?运行echo $?编译成功会返回1如果return -1;编译后运行结果返回255二维数组int a[3][5];在内存里通常理解a是一个3行5列矩阵二维数组的遍历一维用一重循环就可以二维就要用两重循环外面层遍历行号里面层遍历列号a[i][j]是一个int。但是a[i,j]就等于a[j]逗号相当于运算符表示第i行第j列单元二维数组的初始化列数不可以省流但行数可以省略列数是必须给出的行数可以由编译器来数每行一个{}逗号分隔最后的逗号可以存在有古老的传统如果省略表示补零函数的调用产生随机数5要素头文件、函数名字、功能、参数、返回值#include time.htime_ttime(time_t*t);功能获取当前系统时间参数常设置为NULL返回值当前系统时间, time_t 相当于long类型单位为毫秒#include stdlib.hvoid srand(unsigned int seed);功能用来设置rand()产生随机数时的随机种子参数如果每次seed相等rand()产生随机数相等返回值无#include stdlib.hint rand(void);功能返回一个随机数值参数无返回值随机数