《C Primer Plus》第六版笔记--1~3章
开始做做笔记,加油!
注:所有笔记基于书内容和我的理解,就挑一些重点记下来,如果大家发现不对的地方欢迎指出嗷~
第一章 初识C语言
1 使用C语言的7个步骤
1.1 定义程序目标
其实就是先要做好整个项目的大纲,作用就如同创业的计划书一般重要
我通常是分为三步:这个项目要达到什么功能、功能如何实现、维护代码,没想到书居然写的那么详细
1.2 设计程序(功能实现)
知道程序要完成的任务之后,就要考虑如何通过程序去实现它
1.3 编写代码
就是按图索骥的将第二步的那些功能用代码表达出来
1.4 编译
编译源代码,编译器将源代码转换成可执行代码(可执行代码指用计算机的机器代码表示的代码)
1.5 运行程序
可执行文件就是可运行的程序,在windows上是exe程序(命令提示符模式)
1.6 测试和调试程序
程序错误称为bug,查找并修复程序错误的过程和调试
1.7 维护和修改代码
拓展程序的功能或者用一个更好的解决方案,这时候就需要维护和修改你的代码
第一步和第二步其实是很重要的,代码永远不是目的,不要为了写代码而写代码哦!
2 windows下集成开发环境
暂时只用windows系统,我相信就人机交互和易用程度来说,windows还是可圈可点的
Windows IDE选择的是Microsoft Visual Studio 2015
通常来说都是用【Win32 控制台应用程序】
尝试运行个Hello.c
#include <stdio.h>
int main()
{
printf ("Hello,World!");
return 0;
}
在这个程序编译和运行都没有问题,但是程序都是一闪而过
这个时候,你可以用两种方法来解决这个问题
system ("pause"),作用是暂停程序
这个方法需要添加头文件stdlib.h,然后将这个语句加在return语句前
搞定之后程序代码是这样的#include <stdio.h>
#include <stdlib.h> int main()
{
printf ("Hello,World!");
system("pause");
return 0;
}
运行结果

getchar(),作用是击键等待
这个方法不需要添加头文件
通常来说一个getchar()已经足够,实际运行的时候则需要根据程序需要来多一个
改定之后程序代码是这样的#include <stdio.h> int main()
{
printf("Hello,World!");
getchar();
return 0;
}
运行结果

在回车后程序就会直接消失~
第二章 C语言概述
1 示例程序1
#include <stdio.h>
int main (void)
{
int num;
num = 9;
printf ("I have %d apple.\n",num);
return 0;
}
1.1 程序讲解

1.1.1 头文件
相当于将stdio.h的文件内所有内容都“黏贴”到该行的位置
#include是C语言的预处理器指令
所有的C编译器都会提供stdio.h,std代表的是“标准”,io代表的是输入/输出,.h后缀代表它是个头文件,这个文件的含义就是标准输入/输出头文件
1.1.2 main函数
如流程图所示,main函数总是第一个被调用的函数,每个工程都需要有一个main函数,C程序一定是从main函数开始执行!
int表示了main函数的返回数类型是整型,通常来说,函数名后的圆括号内会包含一些传入函数的参数,该程序中没有传递参数,则加个void在括号内
你可能在VC++6.0之类的编译器可能看过这样子的main函数void main(),注意哦,C标准中从未定义过void main,不建议大家来搞这种作死的行为
1.1.3 注释
/*这是个简简单单的注释*/
/*
这是个简简单单的注释
*/
注释可以说是非常方便的功能了,好的注释可以让你和其他人来更好地理解你的代码和逻辑
C99增加了一种新的注释方法,普遍用于C++和java
//这是另一种新的注释,只适用于单行
int nb;
int a; //也可以用在这里
1.1.4 花括号、声明
一般来说,所有C函数都会使用花括号{}来标记函数的开始和结束,且只有花括号有这种功能
声明:int num;这行代码叫声明,它表达了两个意思,定义了一个名为num的变量、定义了num的数据类型为int整型
int 是C语言的一个关键字(后续会讲解关键字)
num 是一个标识符,通过声明,我们可以把特定的标识符和计算机内存中的特定位置联系起来
C99和C11遵循C++的管理,可以把声明放在块中的任意位置
int a;
a = 1;
…………
…………
int b;
b = 999;
标识符的命名规则
可以用小写字母、大写字母、数字、下划线(_)来命名,且名称的第一个字符必须是字母或者下划线,示例如下
| 有效的名称 | 无效的名称 |
|---|---|
| wiggles | $z]** |
| cat2 | 2cat |
| Hot_Tub | Hot-Tub |
| taxRate | tax rate |
| _kcab | don't |
1.1.5 赋值、printf函数、return语句
num = 1;赋值是C语言的基本操作之一,这行代码的意思是将1这个值赋给num变量
printf函数是C语言的一个标准函数,printf ("I have an apple");如这一句,冒号中的内容就是参数,而且是实际参数(实参),形参则是函数中来储存值的变量
printf ("apple is great\n");在这句的输出中并不会看见\n,\n代表换行符,作用和键盘按下Enter键一样。换行符是转义序列的一种,转义序列常用于无法直接输入或难以表达的字符,如\t代表Tab键,\b代表Backspace键,转义字符都从反斜杠开始()
printf ("He have %d apple",a);在这句中的输出中我们会看到%d的位置上出现了a的值,这是因为%d可以将变量作为十进制整数打印
return语句:所有有返回值的C函数都要有return语句,如果遗漏了main函数的return函数,程序在运行至}的时候会自动返回0,希望大家养成有返回值函数后面就有return语句的好习惯。
2 示例程序2
#include <stdio.h>
int sixtimes(int times);
int main(void)
{
int feet,fathoms;
fathoms = 2;
feet = sixtimes(fathoms);
printf ("There are %d feet in %d fathoms\n",feet,fathoms);
printf ("Yes,I said %d feet",6*fathoms);
}
int sixtimes(int times)
{
return 6*times;
}
2.1 程序讲解
2.1.1 多条声明
int feet,fathoms;函数在一行代码中声明了两个函数,这种声明等价于
int feet;
int fathoms;
2.1.2 多个函数
我们可以看见sixtime()函数出现了三次,分别是声明、调用和定义
函数声明:我们直接复制函数头部,加个分号即可
函数的调用:跟之前说的printf函数类似,fathoms作为实参,times作为形参,feet得到sixtimes的返回值
函数定义:形式与main函数相似,都是函数名、花括号之类的。注:何时执行sixtimes函数取决于它在main函数中调用的位置,而非他在文件中的位置
3 关键字和保留标识符
ISO C关键字
| auto | extern | short | while |
|---|---|---|---|
| break | float | signed | _Alignas |
| case | for | sizeof | _Alignof |
| char | goto | static | _Atomic |
| const | if | struct | _Bool |
| continue | inline | switch | _Complex |
| defalut | int | typedef | _Generic |
| do | long | union | _Imaginary |
| double | register | unsigned | _Noreturn |
| else | restrict | void | _Static_assert |
| enum | return | volatile | _Thread_local |
| 粗斜体的关键字(最右边的整列)是在C11标准中提出的 | |||
| 斜体的关键字是在C99标准中提出的 | |||
| 粗体的关键字是在C90标准中提出的 |
注:关键字不可以用来做标识符哦
第三章 数据与C
1 示例程序
/* platinum.c -- your weight in platinum */
#include <stdio.h>
int main(void)
{
float weight; /* 你的体重 */
float value; /* 相等重量的白金价值 */
printf("Are you worth your weight in platinum?\n");
printf("Let's check it out.\n");
printf("Please enter your weight in pounds: ");
/* 获取用户输入 */
scanf("%f", &weight);
/* 假设白金的价格是每盎司$1700 */
/* 14.5833用于将英镑常衡盎司换成金衡盎司 */
value = 1700.0 * weight * 14.5833;
printf("Your weight in platinum is worth $%.2f.\n", value);
printf("You are easily worth that! If platinum prices drop,\n");
printf("eat more to maintain your value.\n");
getchar();
getchar();
return 0;
}
1.1 程序讲解
float weight;建立了新的浮点数类型的变量,已处理更大范围的数据,可以带小数的数字- 为了打印float类型的变量,printf函数采用%f来处理浮点数。%.2f之类的可以精准控制输出的位数
- scanf()用于读取键盘的输入。通过%f可以读取到用户输入的浮点数,&weight告诉scanf()将输入值赋给名为weight的变量,scanf()通过&符号找到weight变量的地址
位、字节、字
位(bit)是最小的储存单元,可以储存0和1,位是计算机内存的基本构建块
字节(byte)是常用的计算机储存单位,字节的标准定义是1字节为8位
字(word)是设计计算机时给定的自然储存单位
2 C语言基本数据类型
2.1 int类型
2.1.1 声明
第二章已经讲解过int声明整型变量,就是int后面加个变量名和分号,如果有多个变量声明的话,可以在同一条声明中声明这些变量,如int hogs,cows,goat;等
2.1.2 初始化
所谓初始化其实就是赋给变量一个初始值,C语言中,初始化和声明可以放在一起,如int a = 999;等
2.1.3 打印
可以用printf函数打印int类型的值,在第二章中介绍过,%d指明了打印整数的位置,%d称为转换说明,在实际使用时,应注意%d和变量个数要相同,编译器可能不会捕获这种错误
2.1.4 整数溢出
ISO C规定的int 取值范围最小为-32768~32767(即大小为2^16)
16位unsigned int 的取值范围时0~65535
/* toobig.c-exceeds maximum int size on our system */
#include <stdio.h>
int main(void)
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
// %u代表这是unsigned int 类型的值
getchar();
return 0;
}
程序的输出效果如图:

这个程序里面,i和j变量都超过了规定的最大值,当他们达到能表示的最大值时,会重新从起始点开始
2.2 char类型
2.2.1 声明
声明方式与int的类似,声明的示例:
char response;
char itable, latan;
2.2.2 字符常量和初始化
如果想将一个字符常量初始化为字母A,则可以用char grade = 'A';做到
在C语言中,单引号(')括起来的单个字符称为字符常量
char a;
a = 'T'; //此时的T是一个字符常量
a = T; //此时的T是一个变量
a = "T"; //此时的T是一个字符串(后续章节会讲)
2.2.3 非打印字符
浏览ASCⅡ码可知,有一些字符是打印不出来的,例如一些代表行为的字符(换行、退格、蜂鸣等)
使用特殊符号序列表示一些特殊的字符,这种符号序列称为转义序列,下面列出一些转义序列
转义序列
| 转义序列 | 含义 |
|---|---|
| \a | 警报(ANSI C) |
| \b | 退格 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| |反斜杠() | |
| ' | 单引号 |
| " | 双引号 |
| ? | 问号 |
| \0oo | 八进制值 (hh必须是有效的2十六进制数,即每可表示0~f中的一个数) |
| \xhh | 十六进制数 (oo必须是有效的八进制数,即每个o可表示0~7中的一个) |
2.2.4 打印字符
#include <stdio.h>
int main (void)
{
char ch;
printf ("Please enter a character.\n");
scanf ("%c",&ch);
printf ("The code for %c is %d.\n", ch, ch);
getchar();
getchar();
return 0;
}
该程序输出结果是
Please enter a character
A
The code for A is 65.
由此可见,%c可以打印一个字符,而%d可以打印字符对应的ASCⅡ码
有符号char范围是-128127,无符号char范围是0255
省略_Bool类型(本人用的少)
2.3 float、double、long double类型
C语言中的浮点数类型有float、double和long double类型,浮点数的表示方法有科学计数法、指数计数法等等,下面列出一些示例
计数法示例
| 数字 | 数字记数法 | 指数记数法 |
|---|---|---|
| 1000000000 | \(1×10^{9}\) | 1.0e9 |
| 123000 | \(1.23×10^{5}\) | 1.23e5 |
| 322.56 | \(3.2256×10^{2}\) | 3.2256e2 |
| 0.000056 | \(5.6×10^{-5}\) | 2.6e-5 |
C标准规定,float至少能表示6位有效数字,取值范围为\(10^{-37}~10^{37}\)
C语言提供了另一种浮点类型double(意为双精度),double的最小取值范围与float相同,一般情况下double占用64位,而不是32位
C的第三种浮点类型是long double,以满足比double更高的精度要求
2.3.1 声明
声明比较跟上面的类似
float noah, jonah;
double troble;
float planck = 6.63e-34;
long double gnp;
2.3.2 浮点型变量
浮点型变量基本形式:有符号数字+e/E
如-1.56E+12、2.87e-3、3.1415、.2、.8E-5等
默认情况下,编译器会假定浮点型常量是double类型的精度
例如some是float变量,语句some = 4.0*2.0;
这样的作法会使用双精度计算(4.0这些默认是double型),然后将乘积截断为float型的宽度,精度高,但会减慢程序的运行速度
浮点数后加上不同的后缀可以覆盖他的默认类型设置
| 后缀 | 类型 |
|---|---|
| f/F | float型 |
| l/L | long double型 |
| 无后缀(默认) | double型 |
2.3.3 打印浮点值
printf函数使用%f打印十进制计数法的float和double类型的浮点数,用%e打印指数,用%Lf、%Le来打印long double类型
给不在函数原型中显示说明参数类型的函数(如printf)传递参数时,C编译器会把float类型的值自动转换成double类型
/* showf_pt.c -- displays float value in two ways */
#include <stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
// 下一行要求编译器支持C99标准
printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);
return 0;
}
输出结果

2.3.4 浮点值的上溢与下溢
不懂,哭了(ㄒoㄒ)
设系统最大float类型值为3.4E38
运行下面的代码
float toobig = 3.4E38 * 100.0f;
printf ("%e\n", toobig);
打印出来的值会变成inf或infinity
这是一种上溢的示例,当变量值超过类型的范围是就会发生这种现象
下溢真的不懂,书上解释的好复杂,我就没笔记了
复数和虚数部分我也没接触
------------恢复内容结束------------
《C Primer Plus》第六版笔记--1~3章的更多相关文章
- C++ Primer Plus 第六版笔记
C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...
- 《C Primer Plus》第六版笔记--4~6章
目录 第四章 字符串和格式化输入/输出 第五章 运算符.表达式和语句 第六章 C控制语句:循环 虽然匆匆忙忙,但还是要做笔记,虽然大概都知道...... 挑一些容易忘记的地方 第四章 字符串和格式化输 ...
- 《C Primer Plus》第六版笔记--7~10章
目录 第七章 C控制语句:分支和跳转 第八章 字符输入/输出和输入验证 第九章 函数 第十章 数组和指针 第七章 C控制语句:分支和跳转 if else 用法 if (expression) //ex ...
- c++ primer plus 第6版 部分三 9章 - 章
c++ primer plus 第6版 部分三 9章 - 章 第9章 内存模型和名称空间 1.单独编译 ...
- 《C++Primer》第五版习题答案--第一章【学习笔记】
C++Primer第五版习题解答---第一章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2022/1/7 第一章:开始 练习1.3 #includ ...
- 《C++Primer》第五版习题答案--第二章【学习笔记】
C++Primer第五版习题解答---第二章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/9 第二章:变量和基本类型 练习2.1: 类 ...
- c++ primer plus 第6版 部分二 5- 8章
---恢复内容开始--- c++ primer plus 第6版 部分二 5- 章 第五章 计算机除了存储外 还可以对数据进行分析.合并.重组.抽取.修改.推断.合成.以及其他操作 1.for ...
- c++ primer plus 第6版 部分一 1-4章
c++ primer plus 第6版 源代码 ---编译器---目标代码---连接程序(启动代码--库代码)---可执行代码 源代码扩展名:c cc cxx C cpp ...
- 《C++ Primer Plus 第六版》读书笔记
CH1-3:处理数据 1 列表初始化 char c={31325}:不允许缩窄 char c={66}; char c={x}:不能为变量 2 强制类型转换 (typename) value type ...
随机推荐
- Python计算身体质量指数BMI
使用Python计算身体质量指数BMI 运行结果如下: 源代码: 1 ''' 2 3. 利用函数思想,将"身体质量指数BMI"源程序封装成为一个函数并调用. 3 :param he ...
- Python入门-分支循环结构
编写代码的过程中,除了基本的变量,数据类型,在实际开发中,大量代码是根据判断条件,进而选择不同的的向前运行方式. 这些向前的运行方式基本分为两种:分支结构,循环结构 1.分支结构 if单分支结构 # ...
- k8s pod 在迁移zookeeper时出现的问题
一次迁移中出现的问题,因为要搬迁机房,集群中的节点服务器分布在两个机房,通过专线打通了,现在需要整体都迁移到其中一个机房,所以pod要进行迁移,机器资源也比较紧张,在迁移中zookeeper迁移出现问 ...
- Java基础之浅谈集合
Java基础知识.关于List.Set.Map接口的了解,以及ArrayList.LinkedList.HashSet.TreeSet.HashMap.TreeMap...
- LinkedList实现
LinkedList源码实现: public class LinkedList<E> { private class Node{ public E e; public Node next; ...
- 微信授权 - wx.openSetting
wx.openSetting({ // 唤醒授权页面 success: res => { console.log('res',res) // 授权成功操作 }, ...
- Codeforces Round #677 (Div. 3) D. Districts Connection思维1200
题目链接 Problem - 1433D - Codeforces 题目 美好的一天,从看不懂题目开始~~ Example input 4 5 1 2 2 1 3 3 1 1 1 4 1 1000 1 ...
- DOM 对象的重点核心
概述 : 文档对象模型(Document Object Model,简称DOM ),是W3C组织推荐的处理可扩展标记语言 (HTML或者XML)的标准编程接口. W3C已经定义了一系列的DOM接口, ...
- cookie和localstorge、sessionStorge的区别
一.背景由来 cookie原来是用来网络请求携带用户信息的,只不过在HTML5出现之前,前端没有本地存储的方法,只能使用cookie代替 localstorge.sessionStorge是html5 ...
- Linux中,MySQL的常用命令
我的博客 登录 mysql -u用户名 -p -- 然后在下面输入密码,Linux的密码不会显示出,盲打就可以 mysql -u用户名 -p密码 -- 这种方式将直接登录 开关 开启数据库 servi ...