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的平方根(实参为负数时会发生定义错误)
返回值 返回计算出的平方根

运算和运算符

自动类型转换

在不同类型的混合运算中,编译器会自动转换数据类型,将参与运算的所有数据先转换为同一种数据类型,然后在进行计算。转换的规则如下

  1. 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,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章相关推荐

  1. 明解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 ...

  2. 明解C语言入门篇_第12章_结构体

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  3. 明解C语言入门篇_第9章_字符串的基本知识

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  4. 明解C语言入门篇_第8章_动手编写各种程序吧

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  5. 明解C语言入门篇_第10章_指针

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  6. 明解C语言入门篇_第4章_程序的循环控制

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  7. 明解C语言入门篇_第13章_文件处理

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  8. 明解C语言入门篇_第7章_基本数据类型

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  9. 明解C语言入门篇_第6章_函数

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  10. 明解C语言入门篇_第5章_数组

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

最新文章

  1. 一次特殊的经历和迷茫-小米平板
  2. C语言再学习 -- 再论数组和指针
  3. openwrt编译时遇到的报错
  4. java B2B2C Springboot电子商城系统 (六) 分布式配置中心(Spring Cloud Config)
  5. SOA架构师注意的问题
  6. linux 文件查找_Linux文件查找
  7. 面对1.3 亿用户数据泄露,企业如何围绕核心数据构建安全管理体系?
  8. [转载] Python学习(五)Numpy通用函数汇总
  9. Python字符串format_map()
  10. C#结构体中的只写属性
  11. 医药行业gsp药店管理软件哪个好用?
  12. 项目质量管理:规划质量管理与控制
  13. 无聊日常——对QQ邮箱盗号邮件的垃圾账号填充
  14. 大学十年(一个程序员的路程)(林锐博士)《1----9》【林锐的大学10年】
  15. 使用ALLMAPS进行辅助组装得到准染色体水平基因组
  16. 游戏开发入门(二)游戏中的设计模式
  17. 免费的Kindle电子书资源
  18. 日期格式不一致问题处理
  19. URL, URI, URN 和 IRI 表示的意思
  20. 计算机有60进制吗,60进制介绍

热门文章

  1. linux编译C文件两种方法
  2. linux终端设置为管理员权限,ubuntu 中的管理员权限
  3. 大一c语言大作业实验报告,大一c语言实验报告
  4. 关于TUN/TAP网卡二三事以及物理网卡Ring buffer
  5. JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
  6. mac使用jeb记录
  7. E24系列电阻 阻值表
  8. android gradle 离线安装,Android Studio离线配置gradle(附gradle下载地址)
  9. codeblocks下载-安装和使用
  10. 大厂面试必考的假设检验