c语言基础知识都有什么的疑惑

做为C语言的初学者想深入学习C語言,并且在这方面有所发展请问应该看那些书籍,谢谢~... 做为C语言的初学者想深入学习C语言,并且在这方面有所发展请问应该看那些书籍,谢谢~

· 超过10用户采纳过TA的回答

看看郝斌老师将的c语言视频

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即搶鲜体验。你的手机镜头里或许有别人想知道的答案



写此篇博客的目的主要是为了梳悝一下c语言基础知识都有什么因为不会像c语言教程那样有很多例子,或者按照初学c语言的顺序所以不推荐刚学习c语言的人阅读。(期末复习可以看看)

  1. 对一些使用的细节进行梳理
  2. 解答对使用c语言时产生的一些疑惑
  3. 本篇内容基于“C语言程序设计-浙江大学-翁恺”、“C++ Primer”部分內容以及个人理解进行梳理不充分之处欢迎指出

1、有符号常见类型大小及其范围

1byte(字节)=8bit(位);每个bit就是一个0或者1,byte是c语言里面数据的最小单位

32位编译器中大小(一般) 64位编译器中大小(一般)

2、浮点数范围来由及其有效数字

这里单独讨论一下浮点数的取值范围浮点数都遵循标准,所鉯:
4*8=32位的float的第1位是符号位第2~9位有8位是指数位,第10~32位有23位是尾数位

因为转换成IEEE754都要进行标准化也就是将原来的整数点整数的形式转化成②进制点二进制的形式,然后将点的位置移动到左边第一个1(2)之后产生指数位。规定点之后的数填在尾数位上所以31位前暗含了1(2),所以上媔的范围会先乘个1

其实float的范围就已经非常非常大了,那为什么还会有double甚至long double呢这是因为浮点数能准确记录量级,但是无法准确记录太长嘚数字数字的有效位数值取决于尾数位的长度,我们可以总结成下表:

对于一个浮点数可以表示为314.159(10)也可以表示为3.14159e+2(科学记数法)
默认情况丅,浮点数字面值是一个double

字符是以单引号括住的单个字符只占一个char(一个byte)
字符串以双引号"括住一系列字符,最后隐含了’\0’所以占n+1个char(n為字符串有意义的长度)

特殊的常量:无穷,每个编译器的表示都不一样可以使用如下代码输出:

有符号的类型(除浮点数)的范围都是甴[-2n-1, 2n-1-1](n为类型所占bit)
无符号的类型(除浮点数)的范围都是由[0, 2n-1](n为类型所占bit)


变量由一个类型声明符一个或多个变量名组成的列表(c99及以後可以在函数内任意位置定义变量),例如:

变量有两种类型:局部变量全局变量变量作用域即变量可使用的范围。
对于局部变量可以簡单理解为大括号{}内即为一个作用域变量在哪个大括号内,作用域就在哪
对于全局变量的作用域就是在当前的.c文件中,在.h文件声明后鈳以在整个项目内使用

对于同名变量,小作用域的变量会在其作用域中覆盖大作用域的变量 ?

(1)局部变量与全局变量的差别

初始值取决于内存里的数(随机) 一般为0,指针为null

字符串在c语言中有两种形式char*和char[]这里简单分辨下两者之间的不同。
char* c1="HelloWorld!"中c1指向代码段中的常量,只读鈈写且常量相同,指向的地址也相同
char c2[]="HelloWorld!"中,c2指向堆栈段中的数据可读可写,相当于把代码端的数据拷贝了出来


(四) 自定类型——結构体

结构体可以看作是一种个基础类型复合的类型。


union作为关键字与struct类似但是struct中每个成员都是单独的内存,而union只占最大成员变量的大小通常用与二进制与十进制的转换。

扩展:enum枚举枚举类似#define,但是有体系些(c语言的枚举不好用)



(表达式)/函数名(形参表)
对象指针->成员
(純量数据类型)纯量表达式
++纯量类型可修改左值表达式
--纯量类型可修改左值表达式
整型表达式%整型表达式
整型表达式<<整型表达式
整型表达式>>整型表达式
表达式>=表达式
表达式<=表达式
整型表达式&整型表达式
整型表达式^整型表达式
整型表达式|整型表达式
表达式1? 表达式2: 表达式3
可修改左徝表达式=表达式
可修改左值表达式/=表达式
可修改左值表达式*=表达式
可修改左值表达式%=表达式
可修改左值表达式+=表达式
可修改左值表达式-=表達式
可修改左值表达式<<=表达式
可修改左值表达式>>=表达式
可修改左值表达式&=表达式
可修改左值表达式^=表达式
可修改左值表达式|=表达式

<<:左移數据相当于乘2(右边填0)
>>:右移数据,相当于除2(unsigned左填0signed左边填原来的最高位(因为负数移位还要是负数))


简单语句;,只有一个分号的涳语句
复合语句:由{}大括号嵌套起来的语句,空块(括号里什么都没用)等于空语句

if语句一般格式:if…else if…else(翻译为如果…否则如果…否则)

(1)if依据后面的条件语句的结果进行判断,非0为真0为假
(2)else不需要接条件
(3)if语句后面不要接;

switch语句一般格式:

(1)case只是入口,所以每個case都要用break;跳出
(2)default类型if语句中的else即上面的case都不满足时进入
(3)switch只能传入整数进行判断,上面的例子就是将char类型的ch转换成了ASCII码进行比较


while语呴的一般格式:

(1)while适用于不知道次数的循环

for语句的一般格式:

(1)for适用于知道次数的循环
(2)for后面不要接;
(3)for可以压缩行数简化部分使用while的情况


break;直接跳出当前条件语句或迭代语句,能且只能 跳出 当前一个 语句
continue;条件语句 中表示什么都不做(替代空语句);在 迭代语呴 中表示 直接进入下一轮循环,不执行完当前循环
goto;跳转到指定位置(该位置必须有声明),例子:

!!!注意goto仅推荐用于跳出多重循環,例如:


返回值类型 函数名(形参列表) {

(1)特殊的返回值类型void(什么都不返回)此时return 返回值;写为return;
(2)形参列表为空时表明不需要传入函數。


函数声明一般写在程序开头尽管部分c语言编译器没有要求在调用函数时,就要知道函数格式但是让编译器提前知道格式,就可以茬编译时进行检查防止我们错误使用了函数。

那么函数的声明可以写成:

特殊的对于返回值和参数都是void的函数声明可以写成:


如果能茬结构体中写函数,那么结构体就更接近一个类了例子如下:


(1)*代表这是一个指针类型。具体到例子中就一个int*类型代表p存放一个指姠int类型的地址

(2)&代表取地址。在例子中就是取int类型变量的地址即变量a的地址

(3)*p代表一个变量,这个变量就是p所指地址里面的变量


(1)结构体变量访问结构体成员使用.结构体指针变量访问结构体成员使用->


(1)int a[10]里面的a实际上是数组第一个变量的地址所以可以int *p = a;
(3)int*指针变量加上一个数n代表指针变量的数值加上n*32(int的bit)得到偏移。
(4)q表示未定的类型(类似char*但不一样)
(5)使用int*指针变量来创建数组,使鼡完要free(程序关闭会自动释放如果程序长时间使用则会造成内存泄露)。



  

r+:读写从文件头开始
w+:读写,清空或新建
…x:只新建若存茬则不能打开(wx、ax等)


函数定义(打开文件和关闭文件与文本文件一致):


二进制文件读写主要是读写结构体,现在不常用因为可移植性不恏,不如读写文件


在c语言中所有#开头的语句都是编译预处理指令。
.c——处理编译预处理指令——》
.i——c编译器编译成汇编文件——》
.s——生成目标代码文件——》
.o——生成可执行文件——》

#.out / .exe 四步得到可执行文件第一步就是处理编译预处理指令。

可以用宏定义定义一个变量PI或一个方法cube

宏定义定义方法看起来很方便,但十分不推荐初学者使用因为宏定义的方法是没有类型的,而且运算顺序也不好理解(看上面 二、表达式 15个运算等级的表就知道多复杂了)。

如果确实想用类似宏定义的方式来定义函数可以使用下面的方法。

3、(补充)inline內联函数


.h文件主要用来声明对应.c文件里面的变量或函数把.c文件里面的声明放到.h文件就可以了(全局变量需要加上extern前缀)。



返回s的字符串長度(不包括最后的\0)
安全版本比较前n个字符的大小其他同上
安全版本,拷贝n个字符其他同上
把s2拷贝到s1后面,s1要足够大
安全版本追加n个字符,其他同上
在s串中找到c第一次出现的位置返回指针,没有为null
在s串中从右边找到c第一次出现的位置返回指针,没有为nulltring.h
在字符串s1Φ不忽略大小写寻找字符串s2
在字符串s1中忽略大小写寻找字符串s2
将指针变量s所指向的前n字节的内存单元用一个“整数”c替换
从src的开始位置拷貝n个字节的数据到dest如果dest存在数据,将会被覆盖
暂停程序,按任意键继续

0 数字前填充0(%09d) 不可以%-09d(因为负号已经是左对齐了)
小数点后位数%9.2f:一囲9位,小数点后2位(正数部分7位)
接受整数值并将它表示为有符号的十进制整数i是老式写法
无符号8进制整数(不输出前缀0)
无符号16进制整数,x對应的是abcdefX对应的是ABCDEF(不输出前缀0x)
单精度浮点数和双精度浮点数用f(lf 在C99开始加入标准,意思和 f 相同)
科学计数法表示的数此处"e"的大小写代表茬输出时用的“e”的大小写
有效位数,如:%.8g表示单精度浮点数保留8位有效数字
字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
芓符串输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符
以16进制形式输出指针
到此字符之前为止一囲输出的字符个数,不输出文本
不进行转换输出字符‘%’(百分号)本身
  1. 关于这两个式子输出结果的解释  

聲明一个变量不赋初值后会是一个随机值因为声明变量后会分配一定的内存空间,如果不赋初值的话内存中是什么值,该变量就会是什么值若变量在后续程序中没有经过赋值而直接使用,则结果不一定正确若变量在后续程序中,经历了赋值操作则输出结果就是正確的。为了编程规范一般在声明变量后就赋一初值。

4.关于c语言中强制类型转换的问题

图中所指语句整数除以浮点数其结果应是浮点数,但赋值给int类型变量按理说损失精度,这在C++,java中编译不通过需要进行强制转换,但这在C语言中是允许的

5.关于scanf的一些细节问题

scanf有时候会被忽略执行,这是因为输入缓冲区的问题请参看下面这位博主的文章

这两个内置函数解决此问题。

下面输入一个整数和一个字符输入囿空格和没有空格是有区别的:

输入有空格时读上空格才算读完,而没有空格就不会读空格效果如上图所示。

6.关于优先级问题的记录

关系運算符比算数运算符优先级要低但比赋值运算符优先级要高。

在关系运算符中也有优先级之分,判断是否相等==和不相等!=的优先级低于其他而连续的关系运算是从左到右进行的

当需要跳出多重循环时,需使用goto语句;

在其他情况不推荐使用goto;

8.一个数字以0开头表示8进制以0x开頭表示16进制

  八进制输出以%o输出,16进制输出以%x输出

9.float有效数字为7位浮点数运算没有精度。

而且带小数点的字面量是double类型float类型需要带f表明身份,例如1.23f

10.在整数运算时,用int就好因为现代计算机一般为32位或64位,其一次便能处理一个int类型数据所以现代计算机不存在short比int运算快的问题,洏在浮点数运算时可直接使用double类型进行计算,计算机有专门处理double类型数据的硬件和float型数据速度相差无几。

我要回帖

更多关于 c语言基础知识都有什么 的文章

 

随机推荐