第5章 运算符、表达式和语句
本章学习过程感觉简单了好多。
循环:
基本运算符:
一元运算符:+、-
二元运算符:=、+、-、*、/
赋值语句目的是把值存储到内存位置上,赋值语句组成:数据对象、左值、右值、运算符
c语言中还有其他很多运算符,比如:sizeof、++、--、%
运算符有优先级
使用时需要注意:
一个语句中不要出现太多运算符
如果一个变量多次出现在一个参数的参数或者一个表达式中,不要使用++、--运算符
表达式和语句:
表达式由运算符和运算对象组成
语句是C程序的基本构建块,大部分语句以分号结尾
复合语句是花括号中的一条或者多条语句,也称为块。
副作用是表达式对数据对象和文件的修改。
类型转换
在一些情况下,C语言会自动类型转换。也可强制类型转换。
在函数中:函数声明,会告诉编译器参数的类型。如果使用函数原型,则会自动进行类型转换比如float转double,这时可能需要在函数中主动强制转换。
第六章 C控制语句:循环
c循环主要分为:while、for、do...while..
c语言中0表示假,1表示真(其实非0都是真),c99增加了 _Bool类型
逗号运算符,在for中常用,使用时,可以保证先执行左边再执行右边
如果使用带返回值的函数,需要使用‘前置声明’预先说明函数的返回类型
第七章 C控制语句:分支和跳转
可以使用if...else...else if.. 来实现条件的判断
getchar()、putchar(),可以每次读取或者输出一个字符。因为只可以处理字符,所以不需要print类似的转换说明,处理速度更快。
ctype.h中有字符处理函数
逻辑运算符包括:&&、|、!,在iso646.h中可以使用 and、or 、not 代替
continue可以跳到下次循环,break可以终止循环
switch可以用来多重循环或者多条件判断
goto可以跳转到对应的语句位置,但是应避免使用。因为C中不使用goto也可以完成应有的功能。
第八章 字符输入/输出和输入验证
getchar()、putchar()可以单字符输入、输出
输入有缓冲输入、无缓冲输入,ANSI C规定输入都是缓冲的。能否无缓冲输入取决于计算机系统。
缓冲输入分为两类:完全缓冲输入(缓冲区被填满)、行缓冲输入
文件与流:不同系统中表示换行或者文件结束的方式不一样,C语言通过标准的I/O包来处理这些差异。使读取文件时的操作在不同操作系统的表示方法中,也可以一致。实际上,C程序处理的是流,而不是文件。流是一个实际输入和输出映射的理想化数据流。
文件结尾:操作系统中可能使用不同的方式来标记文件的结尾,在C语言中使用EOF判断即可。
重定向:重定向链接符连接一个可执行程序和一个数据文件。包括:输入重定向、输出重定向、组合重定向。
输入验证:略过
第九章 函数
函数在使用时需要注意以下概念:函数原型、函数调用、函数声明、函数参数、函数内部变量
驱动程序:测试函数的程序有时被称为驱动程序,如果函数成功通过测试,表明可以安装在一个更重要的函数中使用。
声明函数原型时,最好使用ANSI C的形式
递归可以代替while,但是while不一定能代替递归,递归占用的内存比while大。尾递归是最简单的递归形式,将
return 函数
写在函数最后边。在编译多文件的项目时,使用头文件可以提高编程的体验。
指针的概念中需要注意&与*,函数的参数可以指定类型为指针。
函数的参数在传参时,当使用非指针类型时,改动函数内传入的参数的值不会影响在函数外的变量的值。但使用指针时,函数内对指针值的改变会影响到外部的指针所对应的变量值。
第十章 数组和指针
数组由相同类型的一系列元素组成。在初始化时,如果初始化赋值列表中的元素小于数组的长度,编译器会把其他都赋值为0。如果不初始化,则初始值都为垃圾值。使用C99中的指定初始化器,可以更灵活的对初始化元素赋值。
可以使用sizeof获取数组的长度。C11中变长数组是一个可选特性
多维数组在初始化时,可以只使用一个花括号,如果值不足,则会补0
数组名是数组首元素的内存地址,指针前使用间接运算符(*)可以得到该指针所指向对象的值。数组指针+1得到下个元素的地址。
将数组作为参数传给函数时,数组会退化为指针,因此会导致sizeof不能正确判断数组的长度(获取到的为指针的长度)。在传递给函数时,一般会给出数组的长度或者数组的结尾指针。(ps:网上有通过define 获取长度的方式)
注意指针的加减计算(防止越界) 以及解引用(防止引用到未初始化的指针,因为创建指针时,如果未初始化系统不会分配存储数据的内存,只会分配存储了指针的内存)
函数形参使用const可以阻止数组被修改。使用const可以创建const数组、const指针、指向const的指针。
多维数组:1. 多维数组的首地址是一个指向指针的指针(双冲间接)2. 指向数组的指针需要定义为数组 3.两个不同类型的指针不能相互赋值 4. 多维数组传值的格式
变长数组:在创建数组时,可以使用变量指定数组维度。
复合字面量:匿名的值,需要临时的值时使用。
第十一章 字符串和字符串函数
暂时略过,等整本学完再回来看
第十二章 存储类别、链接和内存管理
标识符的作用域和链接表明了程序的哪些部分可以使用它
作用域:块、函数、函数原型作用域或者文件作用域
链接:外部链接、内部链接、无链接
存储期:静态存储期、自动存储期、线程存储期、动态分配存储期
存储类别:自动变量、寄存器、静态外部链接(使用时,需要使用extern再次声明)、静态内部链接、静态无链接
随机函数都是由一个种子生成的,如果初始种子固定,那么生成的随机数也一样。可以使用一些可变量来初始化随机种子
可以使用malloc、calloc来动态分配内存,calloc初始化时会将所有位初始化为0。使用free释放内存
存储类别与内存分配
具有外部链接、内部链接、无链接的静态变量:在程序开始执行的时候被创建,在程序结束时被销毁
自动变量:在进入所在块时,被创建,在离开块的时候消失。这部分内存通常作为栈来处理
动态分配的内存,在分配时创建,free时被销毁
限定符:
const(值不能被修改)
volatile(值只有代理可以修改,比如时钟设置。防止被编译器优化)
restrict(表明该指针是访问值的唯一方式,便于编译器优化)
_Atomic(表明是一个原子类型的变量,同时只能被一个线程操作)
static(另外一个用法:告诉编译器应该如何使用参数)
待学习内容:14(50页)、16(40页)、17(60页)