Loading

《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;
}

在这个程序编译和运行都没有问题,但是程序都是一闪而过
这个时候,你可以用两种方法来解决这个问题

  1. system ("pause"),作用是暂停程序
    这个方法需要添加头文件stdlib.h,然后将这个语句加在return语句前
    搞定之后程序代码是这样的
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        printf ("Hello,World!");
        system("pause");
        return 0;
    }
    
    运行结果
    image
  2. getchar(),作用是击键等待
    这个方法不需要添加头文件
    通常来说一个getchar()已经足够,实际运行的时候则需要根据程序需要来多一个
    改定之后程序代码是这样的
    #include <stdio.h>
    
    int main()
    {
        printf("Hello,World!");
        getchar();
        return 0;
    }
    
    运行结果
    image
    在回车后程序就会直接消失~

第二章 C语言概述

1 示例程序1

#include <stdio.h>

int main (void)
{
    int num;
    num = 9;

    printf ("I have %d apple.\n",num);

    return 0;
}

1.1 程序讲解

image

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 程序讲解

  1. float weight;建立了新的浮点数类型的变量,已处理更大范围的数据,可以带小数的数字
  2. 为了打印float类型的变量,printf函数采用%f来处理浮点数。%.2f之类的可以精准控制输出的位数
  3. 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;
}

程序的输出效果如图:
image
这个程序里面,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+122.87e-33.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;
}

输出结果
image

2.3.4 浮点值的上溢与下溢

不懂,哭了(ㄒoㄒ)

设系统最大float类型值为3.4E38
运行下面的代码

float toobig = 3.4E38 * 100.0f;
printf ("%e\n", toobig);

打印出来的值会变成inf或infinity
这是一种上溢的示例,当变量值超过类型的范围是就会发生这种现象

下溢真的不懂,书上解释的好复杂,我就没笔记了

复数和虚数部分我也没接触
------------恢复内容结束------------

posted @ 2021-04-22 13:45  Dragonet-Z  阅读(261)  评论(0编辑  收藏  举报