明解C语言 初级篇1~8章
C语言中的一些经常忘记的知识
- 函数
- 作用域与存储期
- 基本数据类型
- size_t型和typedef型
- 按位操作的逻辑运算
- 位移运算符
- 整型后缀
- 浮点数
- 运算和运算符
- 自动类型转换
- 整形提升
- 动手编写各种程序吧
- 函数式宏
- 函数式宏和逗号运算符
- 枚举类型
- 输入输出和字符
- \\'和\\''的用法
1.使用printf函数输出的时候,若想输出%,必须写成%%。
2.进行整数除法或者取模运算的时候,当操作数中至少有一个为负时,结果是依赖编译器的。举例如下:
例子 | x / y | x%y |
---|---|---|
负除以负 例x=-22,y=-5 | 4 | -2 |
负除以负 例x=-22,y=-5 | 5 | 3 |
负除以正 例x=-22,y=5 | -4 | -2 |
负除以正 例x=-22,y=5 | -5 | 3 |
正除以负 例x=22,y=-5 | -4 | 2 |
正除以负 例x=22,y=-5 | -5 | -3 |
3.使用printf函数输出浮点数转换说明%f,默认小数点后6位数字,使用scanf函数读取浮点数时,用%lf.
4.转换说明的格式 %09.9f
(1)设定了0标志后,如果数值前面有余位,则用0补齐位数,否则用空白补齐。
(2)第一个9为最少要显示出的字符位数。另外,如果有“ - ”,数据会左对齐,未设定会右对齐。
(3)小数点后的9指定显示的小数位数(注意整数没有)
5.逻辑运算符中的&&运算符在左操作数的判断结果为0时不对右操作数进行判断,||运算符在左操作数的判断结果不为0时不会对右操作数进行判断(短路求值情况)。
6.循环中使用continue语句后,循环体的剩余部分会被跳跃,break语句会跳出内层循环。
函数
1.赋给变量的标识符,它的名称都有一个通用的范围,成为作用域,在程序块中声明的变量的名称,只在该程序块中通用,在其他区域无效。
2.在函数外声明的变量标识符,其名称从声明的位置开始,到该程序的结尾都是通用的,这样的作用域称为文件作用域。
3.调用函数的过程中,如果传递数组时只是引用所接受的数组的元素值,而不改写的话,在声明数组的形参的过程中应该加上const。
void printf_array(const int v[],int n){...}
作用域与存储期
1.在相同的作用域内,如果两个同名变量分别拥有文件作用域和块作用域,那么只有拥有块作用域的变量是“可见的”,而拥有文件作用域的变量会被隐藏起来。
2.在相同的作用域内,当同名变量都被赋予了块作用域的时候,内层的变量是“可见”,而外层的变量会被“隐藏起来”。
int x = 75; //文件作用域
void print_x()
{printf("x=%d\n", x);
}
int main()
{int x = 999;//块作用域print_x();printf("x=%d\n", x);for (int i = 1;i < 2;i++){int x = i * 100;//块作用域printf("x=%d\n", x);}return 0;
}
输出结果:x=75 x=999 x=100
3.存储期:在函数中声明的变量,它们是有寿命的,用存储期表示。
自动存储期:不使用static定义的对象。
静态存储期:在函数中使用static定义出的对象,或者在函数外声明定义出的对象。
两者比较 | 自动存储期 | 静态存储期 |
---|---|---|
生成 | 程序执行到对象声明的时候创建出相应的对象 | 在程序开始执行的时候被创建出来 |
初始化 | 如果不显式的进行初始化,则该对象会被初始化为不确定的值 | 如果不显式的进行初始化,则该对象会被初始化为0 |
消失 | 执行到包含该声明的程序块的结尾的时候,该对象消失 | 到程序结束的时候消失 |
int fx = 0;
void func()
{static int sx = 0;int ax = 0;printf("%3d%3d%3d\n", ax++, sx++, fx++);
}
int main()
{int i = 0;for (i = 0;i < 3;i++)func();return 0;
}
运行结果:0 0 0
0 1 1
0 2 2
基本数据类型
size_t型和typedef型
1.由sizeof运算符生成的值的数据类型是在<stddef.h>头文件中定义的size_t型,在许多编译器中用typedef声明来定义size_t型。
typedef unsigned size_t;//unsigned因编译器的不同可能会有不同
2.typedef声明是创建数据类型的同义词的声明。(而非创建新的数据类型)
typedef A B typedef声明为已有的数据类型A创建别名B
按位操作的逻辑运算
对于整数内部的位,有四种逻辑运算,分别为:
按位与:a&b 两者都为1时结果为1
按位或:a|b 只要有一个为1,结果就为1
按位异或:a^b 有且只有1个为1,结果才为1
按位求反:a~b 将每一位取反
(这些运算只针对整数数据类型或者枚举型)
位移运算符
(适用于无符号整型,如果是有符号整型的负数,分为逻辑位移和算术位移)
<<运算符:a<<b 将a左移b位,右边空出的位用0填充
>> 运算符:a>>b 将a右移b位,空出的位置同样补0
整型后缀
在部分整型常量后附带U和L等符号,这些符号称为整型后缀
u和U…表示该整型常量为无符号类型
l和L…表示该整型常量为long型
无符号整型的运算不会发生溢出,当运算结果超过最大值时,结果为“数学运算结果%(该无符号整型能够表示的最大值+1)。
浮点数
1.分为三种:float double long double
long doule 的显示用%lf
2.浮点型后缀:在浮点型常量的末尾加上指定类型的浮点型后缀,后缀f或F表示float型,后缀l或者L表示long double 型。
3.
项目 | sqrt |
---|---|
头文件 | #include <math.h> |
原型 | double sqrt(double x) |
说明 | 计算x的平方根(实参为负数时会发生定义错误) |
返回值 | 返回计算出的平方根 |
运算和运算符
自动类型转换
在不同类型的混合运算中,编译器会自动转换数据类型,将参与运算的所有数据先转换为同一种数据类型,然后在进行计算。转换的规则如下
- 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
2.所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
3.char 和 short 参与运算时,必须先转换成 int 类型。
整形提升
链接: link.
动手编写各种程序吧
函数式宏
1.语法: #define sqr(x) ( (x)*(x) ) //计算一个数的平方的函数宏
注意:不要在宏名称和“(”之间写入空格
在宏定义时,将每个参数以及整个表达式都用括号括起来,防止出现宏的副作用。
2.函数式宏sqr是在编译时展开并填入程序的,没有函数定义的严格,它同样可以不带参数。
函数式宏和逗号运算符
如果宏定义中要代换两个以上的表达式,则使用逗号运算符连接,使其在语法上构成一个表达式。
#define puts_alert(str) (putchar('\a'),puts(str))int main(){int n;printf("请输入一个整数:");scanf("%d",&n);if(n)puts_alert("这个数不是0.");elseputs_alert("这个数是0.");return 0;}
逗号运算符:a,b 按顺序判断a和b,对a仅进行判断,判断结果会被省去,整个表达式最终生成b的判断结果。
枚举类型
枚举类型是用来表示一定整数值的集合。
#include <stdio.h>
enum animal { Dog, Cat, Monkey, Invalid};//枚举类型的声明,animal是枚举名,大括号中的是枚举常量
void dog()
{puts("汪汪!!");
}
void cat()
{puts("喵喵~~");
}
void monkey()
{puts("唧唧!!");
}enum animal select()
{int tmp;do {printf("0...狗 1...猫 2...猴 3...结束:");scanf_s("%d", &tmp);} while (tmp<Dog || tmp>Invalid);return tmp;
}
int main()
{enum animal selected;do {switch (selected = select()) {case Dog:dog();break;case Cat:cat();break;case Monkey:monkey();break;}} while (selected != Invalid);return 0;
}
各枚举常量从左往右分别被赋予0,1,2,3
变量selected的类型是enum animal,它的取值范围是0,1,2, 3
注意:枚举常量的值也可以根据需要任意设置,只要在枚举常量的名称后面写上赋值运算符“=”和值就行了。
通过赋值运算符"="赋值的枚举常量,其值为定值,没有给定值的枚举常量,其值为前一个枚举常量+1.
多个枚举常量允许有相同的值
程序中的枚举名是可以省略的
枚举名和变量名属于不同的命名空间,因此是可以相同的
输入输出和字符
关于putchar 的使用添加链接描述
关于scanf的使用添加链接描述
关于输入流中的EOF添加链接描述
\‘和\’'的用法
在字符串字面量中的写法:
字符’‘必须使用转义字符\’‘来表示,例如:AB’‘C就要写成’‘AB’‘C’’
字符‘既可以用’也可以使用\‘来表示
在字符常量中的写法:
与上面的恰好相反
明解C语言 初级篇1~8章相关推荐
- 明解C语言 入门篇 第七章练习题
明解C语言 入门篇 第七章练习题 7-1 7-2 7-3 7-4 7-5 7-6 7-7(问题已解决) 7-8 7-9 7-10(此处借鉴了@野猪力量的代码) 7-11 7-1 #include &l ...
- 明解C语言入门篇_第12章_结构体
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第9章_字符串的基本知识
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第8章_动手编写各种程序吧
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第10章_指针
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第4章_程序的循环控制
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第13章_文件处理
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第7章_基本数据类型
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第6章_函数
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第5章_数组
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
最新文章
- 一次特殊的经历和迷茫-小米平板
- C语言再学习 -- 再论数组和指针
- openwrt编译时遇到的报错
- java B2B2C Springboot电子商城系统 (六) 分布式配置中心(Spring Cloud Config)
- SOA架构师注意的问题
- linux 文件查找_Linux文件查找
- 面对1.3 亿用户数据泄露,企业如何围绕核心数据构建安全管理体系?
- [转载] Python学习(五)Numpy通用函数汇总
- Python字符串format_map()
- C#结构体中的只写属性
- 医药行业gsp药店管理软件哪个好用?
- 项目质量管理:规划质量管理与控制
- 无聊日常——对QQ邮箱盗号邮件的垃圾账号填充
- 大学十年(一个程序员的路程)(林锐博士)《1----9》【林锐的大学10年】
- 使用ALLMAPS进行辅助组装得到准染色体水平基因组
- 游戏开发入门(二)游戏中的设计模式
- 免费的Kindle电子书资源
- 日期格式不一致问题处理
- URL, URI, URN 和 IRI 表示的意思
- 计算机有60进制吗,60进制介绍