C语言基础知识总结

article/2025/10/2 4:07:50

本文的目的是记录平时工作学习过程中学习到的C语言知识,由于单独一篇文章记录的话可能篇幅过少,因此置顶此文用作此用处,本文从2017-12-16开始记录,后续新增内容不单独列出时间,在MarkEditor中有相应的版本记录。

文件描述符

EOF(end of file)文件结束,参考如下代码:

#include <stdio.h>int main()
{int c;while((c = getchar())!=EOF){printf("%c",c);}printf("\n");printf("Last time %d\n",c);return 0;
}

当输入的字符不是EOF时会打印输入的字符,然后输入EOF时退出while循环,我们通过printf打印出该值,之所以不把c声明为char,是因为它必须足够大,除了能存储任何可能的字符外还要能存储文件结束符EOF。

下面的程序是统计输入的行数 单词数和字符数,程序虽小,短小精悍:

#include <stdio.h>
#define IN 1
#define OUT 0int main()
{int c,nl,nw,nc,state;state = OUT;nl = nw = nc = 0;while((c = getchar()) != EOF){++nc;if(c=='\n')++nl;if(c==' '|| c=='\t'|| c=='\n')state = OUT;else if(state == OUT){state = IN;++nw;}}printf("%d %d %d\n",nl,nw,nc);return 0;
}

该程序对单词的定义比较宽,它是任何不包含空格、制表符或换行符的字符序列。

函数参数为空

为了与老版本的C语言程序兼容,ANSI C语言把空的参数表看成老版C语言的声明方式,并且对参数表不再进行任何检查。在ANSI C中如果要声明空参数表,则必须使用关键字void进行显示声明。
“定义”:表示创建变量或分配存储单元
“声明”:说明变量的性质,但并不分配存储单元

类型 运算符 表达式

‘x’ 与“x”的区别:
‘x’是一个整数,其值是字母x在机器字符集中对应的数值。
“x”是一个包含一个字符以及一个结束符’\0’的字符数组。
define语句与枚举的区别:
define编译器不检查这种类型变量中存储的值是否为该枚举的有效值。枚举变量提供这种检查,因此枚举比define更具优势。
默认情况下外部变量的值与静态变量的值将被初始化为0.未经显示初始化的自动变量的值为未定义。

按位运算符

我们必须将按位运算符& | 同逻辑运算符&& ||区分开来,后者用于从左至右求表达式的真值。例如,如果x的值为1,y的值为2,那么,x&y的结果为0,而x&&y的值为1.
x=x&~077
设置x的最后6位为0,表达式x=x&~077与机器字长无关,它比形式为x&0177700的表达式要好,因为后者假定x是16位的数值,这种可移植的形式并没有增加额外开销。
~(~0 << n)
~0 << n将~0左移n位,并将最右边的n位用0填补。再使用~运算对它按位取反,这样就建立了最右边n位全1的屏蔽码。
二分查找的另一种形式:在while中只比较了两次,通过打印low mid high的值可以清楚的了解查找过程。

int binsearch(int x, int v[], int n)
{int low, high, mid;int times = 0;low = 0;high = n - 1;mid = (low + high) / 2;while (low <= high &&v[mid]!=x){times += 1;printf("%d times,low=%d,mid=%d,high=%d.\n",times,low,mid,high);if (x < v[mid])high = mid - 1;elselow = mid + 1;mid = (low + high) / 2;}printf("Last time %d times,low=%d,mid=%d,high=%d.\n",times+1,low,mid,high);/* 虽然去掉了相等的测试,但如果有相等的情况,必然在v[mid]中 */if (v[mid] == x)return mid;elsereturn -1;
}

运算符优先级


在switch语句中case的作用只是一个标号,因此,某个分之中的代码执行完后,程序将进入下一分支继续执行,除非在程序中显示地跳转。跳出switch语句最常用的方法是使用break与return 语句。break语句还可强制控制流从while for 和do while循环语句中立即退出。

数组与指针的区别

#include <stdio.h>
#include <string.h>
int GetSize(int data[])
{return sizeof(data);
}int main()
{int data1[]={1,2,3,4,5};int size1 = sizeof(data1);int *data2 = data1;int size2 = sizeof(data2);int size3 = GetSize(data1);printf("%d %d %d\n",size1,size2,size3);return 0;
}

在64位系统运行结果为20 8 8,size1=4*5,size2是指针,64位的话指针占用8个字节,当数组作为函数参数进行传递时,数组自动退化为同类型的指针。所以size2和size3相同。
如果在xcode中编辑上述代码,会在代码位置出现如下提示:
Sizeof on array function parameter will return size of ‘int *’ instead of ‘int []’

二维数组作为函数参数

daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
}
如果将二维数组作为参数传递给函数,那么函数的参数声明中必须指明数组的列数。数组的行数没有太大关系,函数调用时传递的是一个指针,它指向由行向量构成的一维数组,其中每个行向量是具有13个整型元素的一维数组,
在该例子中,传递给函数的是一个指向很多对象的指针,其中每个对象是由13个整型元素构成的一维数组。因此,如果将数组daytab作为参数传递给函数f,那么f的声明应该写成如下形式:
f(int daytab[2][13]){……}
也可以写成
f(int daytab[][13]){……}
由于数组的行数无关紧要,所以该声明还可以写成:

f(int (*daytab)[13]){……}

这种声明形式表明参数是一个指针,它指向具有13个整型元素的一维数组。因为方括号[]的优先级高于*的优先级,所以上述声明中必须使用圆括号,如果去掉圆括号
int *daytab[13]
则变成声明一个数组,该数组有13个元素,其中每个元素都是一个指向整型对象的指针。一般来说,除数组的第一维可以不指定大小外,其余各维必须明确指定大小。

goto语句与标号

goto语句最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。这种情况下使用break语句是不能达到目的的,它只能从最内层循环退到上一级的循环。

输出格式化控制

flag width.precisionThe flag can be any of:flag meaning- left justify

+ always display signspace display space if there is no sign0 pad with leading zeros# use alternate form of specifier
%#o adds a leading 0 to the octal value

%#x adds a leading 0x to the hex value

%#f or

%#e ensures decimal point is printed

%#g displays trailing zeros

作用域规则

名字的作用域指的是程序中可以使用该名字的部分。对于在函数开头声明的自动变量来说,其作用域是声明该变量名的函数。不同函数中声明的具有相同名字的各个局部变量之间没有任何关系。函数的参数也是这样的,实际上可以将它看作是局部变量。
如果函数没有参数,则使用void进行声明。


http://chatgpt.dhexx.cn/article/XN3Z6vGC.shtml

相关文章

【必读】C语言基础知识大全

C语言程序的结构认识 用一个简单的c程序例子&#xff0c;介绍c语言的基本构成、格式、以及良好的书写风格&#xff0c;使小伙伴对c语言有个初步认识。 例1&#xff1a;计算两个整数之和的c程序&#xff1a; #include main() { int a,b,sum; /*定义变量a,b&#xff0c;sum为整…

C语言基础知识概况

一、什么是C语言 就如人的语言分汉语英语&#xff0c;作用是实现人与人之间的交流相同。C语言是一门计算机语言。实现人与计算机交互的一种语言。C语言是一门广泛用于底层开发的编程语言 计算机的结构自上而下大概分为以下几层 应用软件QQ、网盘用户操作系统windows、Linux硬…

c语言基础知识 入门必看(保姆级教学)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 C语言基础 1.什么是C语言&#xff1f;为什么要学好C语言&#xff1f; 这是2022年球程序员使用计算机语言的排名&#xff1a;我们可以很清楚的看的c语言和c在将…

C语言基础知识入门(大全详解)

一、C语言基础知识入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语…

单片机C语言基础知识篇

本人是一名在校的即将大四的物联网专业学生&#xff0c;暑假期间无聊&#xff0c;想写一些东西&#xff0c;来记录之前学过的一些单片机的基础知识&#xff0c;由于记纸质笔记太过低效率了&#xff0c;而且也不看&#xff0c;所以想学着写博客来记录。后续会不定期推出Arduino篇…

C语言基础知识总结大全(建议收藏)

前言&#xff1a;C语言是当代人学习及生活中的必备基础知识&#xff0c;应用十分广泛&#xff0c;下面为大家带来C语言基础知识梳理总结&#xff0c;C语言零基础入门绝对不是天方夜谭&#xff01; 1 算法结构 一、顺序结构、选择结构、循环结构&#xff1b;二、循环结构又分为…

c语言基础知识点字母和含义,大学c语言必背基础知识_c语言基础知识大全

描述 对于刚学计算机编程的同学来说,没一个编程知识都觉得很重要,其实不是的。下面小编为大家整理了相关大学c语言必背基础知识,希望大家喜欢。 大学c语言必背基础知识 举例说明: printf(“-”,123 ); 第二部分有三位,大于指定的两位,原样输出123 printf(“]”,123 );…

【C语言】C语言中基础操作符详细讲解

接着上次的C语言基础知识梳理&#xff0c;让我们来简单了解一下C语言里的操作符 目录 整数的二进制表示形式 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑运算符 条件操作符-三目操作符 下标引用、函数调用、结构成员访问操作符 隐式类型…

代理模式的理解?代理模式的应用场景?

说说你对代理模式的理解&#xff1f;应用场景&#xff1f; 一、是什么 代理模式&#xff08;Proxy Pattern&#xff09;是为一个对象提供一个代用品或占位符&#xff0c;以便控制对它的访问 代理模式的关键是&#xff0c;当客户不方便直接访问一个对象或者不满足需要时&…

设计模式 —— 代理模式

目录 一、代理模式的基本介绍 二、静态代理 三、动态代理 3.1 动态代理模式的基本介绍 四、Cglib 代理 4.1 Cglib 代理模式的基本介绍 五、几种常见的代理模式介绍— 几种变体 一、代理模式的基本介绍 代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对…

Spring:代理模式

一、概述 代理模式分为静态代理以及动态代理&#xff0c;属于23中设计模式之一。动态代理是SpringAop的底层。代理的概念如下图所示&#xff1a; 二、 静态代理 上图角色分析&#xff1a; 抽象角色&#xff1a;一般会使用接口或者抽象类来解决真是角色&#xff1a;被代理的角色…

什么是代理模式,如何写一个代理模式

什么是代理模式 代理模式分为静态代理模式&#xff0c;和动态代理模式&#xff0c;代理模式就是创建一个代理对象&#xff0c;由代理对象来接管原对象的引用,静态代理模式需要让代理类和被代理的类实现同一个接口&#xff0c;通过代理类中定义的构造方法将被代理的对象作为参数…

代理模式(Proxy)

代理模式介绍 代理模式:为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象好处是:可以在目标对象实现的基础上,增强额外的功能操作&#xff0c;即扩展目标对象的功能被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象代…

代理 模式

代理模式 Proxy Pattern 为其他对象提供一个代理以控制对这个对象的访问 可以详细控制访问某个&#xff08;某类&#xff09;对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。 静态代理 直接写死的代码的代理逻辑 动态代理 动态…

代理模式例子

1.概念 代理模式就是为某个对象提供一种代理&#xff0c;以控制对这个对象的访问。 2.涉及角色 抽象角色&#xff1a;声明真实对象和代理对象的共同接口&#xff1b; 代理角色&#xff1a;代理对象角色内部含有对真实对象的引用&#xff0c;从而可以操作真实对象&#xff…

代理模式的使用

一.代理模式 代理模式是java常用的设计模式。 代理的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 简单点说就是代理对象与实际对象都实现了相同的接口&#xff0c;我们可以通过代理对象来间接的访问实际对象&#xff0c;也因为这种间接性&#xff0c;我…

C++之代理模式

目录 模式思想 简介 组成 优点 代码实现 情景 如果不使用代理的话&#xff1a; 加代理的话&#xff1a; 结果 模式思想 简介 代理模式&#xff1a; 通过代理类&#xff0c;来控制实际对象的访问权限。 在某些情况下&#xff0c;一个对象不适合或者不能直接引用另…

代理模式与动态代理模式

原文地址&#xff1a;点击打开链接 1、代理模式 所谓代理&#xff0c;就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下&#xff0c;一个客户不想或者不能够直接引用一个对象&#xff0c;而代理对象可以在客户端和目标对象之前起到中介的作用。 代理模…

设计模式之代理模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、代理模式是什么&#xff1f; 代理模式是一种结构型的软件设计模式&#xff0c;在不改变原代码前提下&#xff0c;提供一个代理…

动态代理模式详解

目录 &#xff08;一&#xff09;什么是动态代理模式 &#xff08;二&#xff09;动态代理模式入门案例 1.完成一个账户转账的功能 2. v1.0版本为转账添加一个事务 3.v2.0将事务从业务层和从持久层剥离 4.v3.0将事务使用动态代理完成 5.v3.0通过cglib实现代理模式 &…