
C语言学习过程知识积累
文章平均质量分 67
zcrlqq
这个作者很懒,什么都没留下…
展开
-
C语言表达式求值(整型提升)
表达式求值的顺序一部分是由操作符的优先级和结合性决定,有些表达式的操作数在求值的过程中可能需要转换为其他类型(是否存在整型提升或算术转换)。真正计算的时候先看相邻操作符的优先级决定先算谁,相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序:即使有了优先级和结合性,表达式也不一定能求出唯一值。原创 2024-12-11 17:28:44 · 1158 阅读 · 0 评论 -
前置++,后置++ 与 * 的优先级问题
(后置++的优先级大于*,先++(p由第一位指向第二位)再解引,等同于*(p++),又因为后置++的特性,先取p的值(就是p指向第一位的值),解引就是5,之后)(再++,注意这里是前面的p++来的,本质上是地址++(p由第一位指向第二位),解引就是1)(先++(p由第二位指向第三位),再解引,又因为后置++,先取值(就是p指向第一位),解引就是2,(++挨得近,先++,q由第一个数指向第二个数,再解引,就是1)(*挨得近,先解引,m指向第一个数,解引就是5,再++,就是5+1=6)原创 2024-12-09 22:51:17 · 1186 阅读 · 0 评论 -
C语言操作符下
! 逻辑反操作 - 负值 +正值 &取地址 sizeof操作数的类型长度(以字节为的单位) ~对一个数的二进制按位取反 --前置后置 ++前置后置 * 间接访问操作符(解引用操作符) (类型)强制类型转换1.sizeof可以计算变量所占内存空间的大小,单位是字节;也可以计算类型所创建的变量占据空间的大小,单位是字节 int y = 10; printf("%d %d %d\n", sizeof(y), sizeof y ,sizeof(int)); //y不打括号也行,说原创 2024-12-08 21:43:56 · 955 阅读 · 0 评论 -
C语言操作符上
3 | -5:111111111111111111111111111111111011(按位或就是补码对其,两个都是0才是0,否则为1)得到的是补码,转换成原码后,得出结果为:-5。3 & -5:00000000000000000000000000000011(按位与就是补码对其,两个都是1才是1,否则为0)得到的是补码,转换成原码后,得出结果为:3。原码:00000000000000000000000000000111(第一个0就是符号位,表示是正数,如果是1就是负数)原创 2024-12-07 23:34:20 · 703 阅读 · 0 评论 -
C语言goto语句(关机程序)
但是某些场合下goto语句还是用得着,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如:一次跳出两层或多层循环。(break只能跳出一层循环)//system是一个库函数,是用来执行系统命令的,它需要包含头文件。printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。shutdown -s -t 60 (意思是在60秒之内关机)3.下面是关机程序的代码,演示goto的用法。原创 2024-11-26 10:46:48 · 228 阅读 · 0 评论 -
C语言数组传参
一维数组数组名是首元素地址,打他打印实际上是打印地址,应该用%p,但是第一个用的%d,相当于将arr的首元素的地址强制类型转换变成了整形的形式来打印,所以结果打印不出来是正常的,要打印整型数组只能通过循环的方式。这里想说的是数组也是有类型的,上面那个例子中,数组的类型就是int [10],以此类推。//值传递(复制)(两个不同的地址,存的相同的内容)//整个数组a的地址(打印出来也是首元素的首地址)请问下面的每个a,&a,b,&b都是什么意思。//首元素的首地址的地址。//b的另外一个地址。原创 2024-11-26 10:37:18 · 991 阅读 · 0 评论 -
C语言数组
下面这个代码只能在支持C99标准的编译器上编译:int n = 10;int arr[n];//这种数组不能初始化//不完全初始化,剩余元素默认初始化为0//完全初始化//括号里可以不填,只放了3个元素//存的是a b c 0 0 0 0 0 0 0//存的是a b c\00 0 0 0 0 0 (字符串结尾有斜杠零)//ch1和ch2的结果是一样的//括号里可以不填,只放了3个元素//括号里可以不填,只放了4个元素(比上面多了‘\0’)原创 2024-11-23 11:59:00 · 963 阅读 · 0 评论 -
函数的嵌套调用,链式访问,函数返回值,生成静态库文件
写一个文件里面包含两个东西与一个是实现函数的文件,另一个是头文件,右击大文件-配置属性-常规-配置类型,改为静态库(.lib)//这就是链式访问,结果是6,因为strlen这个函数的返回值就是他所求字符串的长度。//结果是1234411,因为printf返回值是他打印的字符的个数。//这里需要返回x+y,故而前面因该写明此函数返回值类型int。//这后面应该指明返回值,即return 的是什么。//注意这是错的,test函数没有返回值。printf("呵呵\n");//注意这样就是错的,不能嵌套定义。原创 2024-11-19 23:39:38 · 350 阅读 · 0 评论 -
交换两个整形变量
/注意向上面这样是无法是主函数中的a和b交换的,当主函数中把a和b两个参数传给swap函数时,swap函数中的x和y确实变成了这两个值,但是这两个函数中的这两个值不是相同的两个值,而是有两份独立的没有关系的,他们的存储地址不一样,即在swap函数中对这两个值进行交换,并不影响main函数中这两个值,故而不能通过上面的代码交换。//指针,把a和b的地址传过去了,那边可以通过地址找到a和b并修改a和b。// 正规一点说就是“当实参传递给形参的时候,形参实实参的一份临时拷贝,对形参的修改不会影响实参.原创 2024-11-18 21:54:04 · 240 阅读 · 0 评论 -
三种循环语句
/即此时q等于31不打印,直接去判断部分,于是31原创 2024-11-15 15:10:30 · 880 阅读 · 0 评论 -
有关getchar和putchar
这是因为在scanf里面输入密码时最后还输入了一个“enter”键,表示确认输入的意思,于是将输入的东西全部放在了缓冲区(这里面不仅有密码,还有enter代表的\n),即缓冲区显示的是“afdgw\n",然而传到password里面的只有密码部分,所以还剩下\n。解决2:和解决1一样,要想办法清空缓冲区,由于不确认缓冲区到底有多少个字符,但是知道最后一个字符一定是‘\n’,所以可以写个循环结构,取了之后判断,只要不是‘\n’就继续,一但是就会跳出循环,这样可以确保清空了缓冲区。原创 2024-11-10 23:48:16 · 331 阅读 · 0 评论 -
今天学习了分支语句
/如果想要else与第一个if相配对,则可以把第二个if括起来。//注意,这是没有加break的形式,如果输入的是前面的,则从此开始,后面的全要打印。3.转向语句:break语句,goto语句,continue语句,return语句。//注意一个等号是赋值的意思,此处不是判断12是否都让与15,而是另b等关于12。//注意else是与最近的if相匹配,if和else是一条语句。//例:输入1,会打印星期1到星期日,输入2会打印星期2到星期日。//if能管住只有下面的一个语句,当有多个语句时,要加括号。原创 2024-11-09 18:23:25 · 905 阅读 · 0 评论 -
指针和结构体
这个变量的名字叫做p,注意不是“*p”,*说明p是指针变量,int 说明p指向的对象是int类型。1.前面说到编号是地址,地址又被称为指针,存放指针的变量就是指针变量,指针就是用来存放地址的。解引操作符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象。64位机器(×64)上的地址:64bit位-8byte,所以指针变量的大小是8个字节。注意不管是什么类型的指针,都是在创建指针变量,指针变量是用来存放地址的。指针变量的大小取决于一个地址存放的时候需要多大空间。二,结构体,用类型创建变量。原创 2024-11-08 12:38:47 · 133 阅读 · 0 评论 -
终于懂了一点内存了!
内存会划分为一个个的内存单元(一个内存单元的大小为:1byte),每个内存单元都有一个编号,1. 这个编号在32位电脑上有32位,每一位就是一个地址,每个地址可能是0或1,由数学知识可知这32个地址有2的32次方种排列组合,即有2的32次方个地址序列,即有2的32次方个编号,即有2的32次方个内存单元,即内存大小为2的32次方byte=2的32次方/1024KB=4096MB=4GB.原创 2024-11-07 23:54:36 · 362 阅读 · 0 评论 -
C语言关键字
static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部连接属性,其他源文件就不能使用这个全局变量了.如图wwer被static修饰了,所以报错了。char,short,int,long,float,double,signed,unsigned 数据类型。#define ADD(x,y) ((x)+(y)) //其中ADD为宏名,x,y为宏参数,(x)+(y)为宏体。2.名字必须是字母,数字,下划线组成,不能有特殊字母,不能以数字开头。原创 2024-11-05 23:29:00 · 312 阅读 · 0 评论 -
操作符知识
虽然创建的是两个源文件,但是他们是一个项目,在同一个项目中,只能有一个main函数,所以第一张图不能运行成功。a-=5 即 a=a-5;a/=5 即 a=a/5;如下图是定义的一个Add函数,由于main函数也是函数,故在建立函数时要写在Add函数外,在main函数的前后并不影响,下图是写在main函数的后面。//会打印,这是判断是否相等,由于在第一个if中也已经将4赋给q了4==4,为真。此时,便可以去定义一个数组,一步到位:int arr[10] = {0,1,2,3,4,5,6,7,8,9};原创 2024-11-04 18:38:05 · 810 阅读 · 0 评论 -
字符与字符串
"c:\test\628\test.c" 它的长度?14(为什么是\62为一个长度,而不是\628?如: \x63 c(首先十六进制转换为十进制:3乘16的0次方+6乘16的1次方=99,根据ASCII码表知88是c)3.如果想打印abcdef,则方法一:“abcdef" 方法二:'a', 'b', 'c', 'd', 'e', 'f','\0 ' 注意两种方法的区别。\130 X(首先八进制转换为十进制:0乘8的0次方+3乘8的1次方+1乘8的2次方=88,根据ASCII码表知88是X)原创 2024-11-03 22:09:07 · 378 阅读 · 0 评论 -
C语言常量
例如 int a = 10;此时a是一个变量,后面可以对a进行修改。但如果在前面加一个const (即const int a = 10) 则此时a不能再被修改,相当于a成了一个常量,但为什么叫常变量呢?int arr[n] = {0} 这个程序其实是不能运行的,有错误。由于arr[ ]是数组形式,括号里面只能装常量,,说明n不是常量,但是n又不能被修改了,结合这两方面,取名为常变量。例:#define MAC 200 (注意不要加逗号,结尾没有分号)3.define定义的标识符常量。原创 2024-11-02 23:44:57 · 142 阅读 · 0 评论 -
C语言数据类型
1.全局变量和局部变量可以使用相同的名字(局部优先原则),但是不建议使用相同的名字;2.在用printf(是一个输出函数)的时候要在一开始写上#include3.在用scanf(是一个输入函数)的时候要在一开始写上#includelong 长整型 4个字节 (C语言规定long的大小大于等于int的大小)2.创建变量的时候要进行初始化(给他一个值),不然这个变量是一个随机值。long long 更长的整型 8个字节。思考2:为什么出现这么多的类型。原创 2024-11-01 23:55:08 · 208 阅读 · 0 评论