第三章
3.4 C语言基本数据类型
3.4.1 int 类型
以十进制表示数字%d,以八进制表示数字%o,以十六进制表示数字%x
要显示各进制数的前缀,必须使用%#o,%#x
3.4.3 char类型
当使用Visual C++使用scanf时会出现C4996错误
解决方法:
把每一个scanf()改为scanf_s
在使用关键字char前可加signed和unsigned,在char处理小整数时很有用,如果是处理字符则不用添加
signed char 范围是-128~127
unsigned char 范围是 0~255
非打印字符
3.4.6 float、double和long double
计数法示例
数字 | 科学计数法 | 指数计数法 |
123000 | 1.23× | 1.23× |
float类型必须至少表示6位有效数字,double类型必须至少表示10位有效数字
通常情况下,float为32位,double为64位
printf()函数使用%f转换说明打印十进制计数法的float和double类型浮点数,%e表示打印指数计数法的浮点数
sizeof ——>以字节为单位给出指定类型的大小。%zd匹配sizeof的返回类型
#include<stdio.h>
int main(void)
{
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type char has a size of %zd bytes.\n", sizeof(char));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type long long has a size of %zd bytes.\n", sizeof(long long));
printf("Type double has a size of %zd bytes.\n", sizeof(double));
printf("Type long double has a size of %zd bytes.\n", sizeof(long double));
return 0;
}
3.5 使用数据类型
C编译器将浮点数转换为整数时,会直接丢弃小数部分,不四舍五入
3.7 转义序列示例
#include<stdio.h>
int main(void)
{
float salary;
printf("\aEnter your desired monthly salary:");
printf("$____\b\b\b\b");
scanf_s("%f", &salary);
printf("\n\t$%.2f a month is $%.2f a year", salary, salary * 12.0);
printf("\rGee!\n");
return 0;
}
3.7.1 程序运行情况
首先运行第一个printf并发出警报声(\a),光标停在冒号后;运行第二个printf光标在$后(\b后退一格);scanf输入的字符替换了____;第三个printf \n\t使得光标移动到下一行的下一个制表位,后打印“”内容光标停留;第四个printf以\r开始使得光标回到当前行的起始位置;\n光标回到下一行。
3.7.2 刷新输出
printf()语句先将输出发送到缓冲区,然后缓冲区的内容不断被发送到屏幕上
当缓冲区满、遇到换行字符或者需要输入的时候,会将缓冲区内容发送到屏幕上
课后编程作业
scanf中不能写成“%.2f”,只能是“%f”
%g可以自动将小数点后没用的0过滤掉
#include <stdio.h>
int main(){
printf("%f",12.3);
printf("%g",12.3);
printf("%f",12.3+12.7);
printf("%d",int(12.3+12.7))
printf("%g",12.3+12.7);
return 0;
}
第四章
4.1 前导程序
scanf_s函数输入字符串时,必须指定允许的字符串长度
#include<stdio.h>
int main()
{
char name[100];
printf("Hi!What's your first name?\n");
scanf_s("%s", name,sizeof(name));
4.2 字符串
由双引号括起
4.2.1 char类型数组和null字符
C语言中字符串以空字符结尾,数组容量必须比待储存字符串的字符数多1
4.2.2 使用字符串
scanf在遇到第一个空白(空格、制表符、换行符)时就不再读取输入
4.2.3 strlen()函数
strlen()函数给出字符串中的字符长度
string.h头文件包含了strlen()函数和其他与字符串相关的函数
4.3 常量和C预处理器
格式:#define NAME value
注:
其中没有=
通常用大写表示符号常量(提高可读性)
"%m.nf"
m:总宽度,包括小数点
n:小数部分位数
m>n+1, 也可以小于, 但编译结果会按实际数据输出
如果m过大, 会在左边补空格
#define还能定义字符和字符串常量。前者用单引号,后者用双引号
4.3.1 const 限定符
const关键字,用于限定一个变量为只读(可以使用,但不能更改),比#define更灵活,在12章讨论
4.3.2 明示常量
limits.h
float.h
4.4 printf()和scanf()
4.4.1 printf()函数
printf()函数打印数据的指令要与待打印数据的类型相匹配。
转换说明及其打印的输出结果
注:p计数法——十六进制浮点数计数法
4.4.3 printf()的转换说明修饰符
printf()的标记
4.4.5 使用scanf()
使用规则
如果scanf()读取基本变量类型的值,在变量前加一个&
如果scanf()把字符串读入字符数组中,不要使用&
scanf()的返回值
scanf()函数的返回值是成功读取的项数。如果没有任何读取项,且需要读取一个数字而用户却输入一个非数值字符串,scanf便返回为0
4.4.6 printf()和scanf()的*修饰符
printf()*修饰符
若不想预先指定字段宽度,希望通过程序指定,可用*代替字符宽度。但还需一个参数告诉函数,字段宽度为多少
#include<stdio.h>
int main(void)
{
unsigned width, precision;
int number = 23856;
double weight = 254.56;
printf("Enter a field width:\n");
scanf_s("%d", &width);
printf("The number is : %*d\n", width, number);
printf("Now enter a width and a precision\n");
scanf_s("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight);
return 0;
}
scanf()*修饰符
把*放在%与转换字符之间,会使得是scanf()跳过相应的输入项
#include<stdio.h>
int main(void)
{
int n;
printf("Please enter three integers:\n");
scanf_s("%*d %*d %d", &n);
printf("The last integer was %d\n", n);
return 0;
}
第五章
5.2 基本运算符
pow()函数用于指数运算
例如:pow(3.5,2.2);返回3.5的2.2次幂
5.2.6 除法运算符
截断:整数除法的小数部分会被丢弃(不会四舍五入)
趋零截断:在C99标准下进行负数的整数除法,会直接丢弃小数部分。如把-3.8转换为-3。
5.3 其他运算符
5.3.1 sizeof运算符和size_t类型
sizeof返回size_t类型的值。是无符号整数类
在C99标准中,%zd转换说明用于printf()显示size_t类型的值
5.3.2 求模运算符%
求模运算符用于整数运算。求余数
在C99标准采用趋零截断后,对于负数求模,如果第一个运算对象是负数,那么求模结果也是负数,如果第一个运算对象是正数,求模结果也是正数
如:11 / 5 = 2;11 %5 = 1
-11 / 5 = -2;-11 % 5 =-1
11 / -5 = -2; 11 % -5 =1
5.3.3 递增运算符:++
将运算对象增加1,有前缀模式和后缀模式
前缀:使用a值之前,递增a
后缀:使用b值之后,递增b
5.5 类型转换
类型转换规则
char和short会被转换成int
涉及两种类型的运算,两个值会被分别转换为两种类型更高的级别
当作为函数参数传递时,char和short被转换为int,float被转换为double
当浮点数类型降级为整数类型时,原来的浮点值会被截断
第六章
6.1 再探while循环
while循环标准格式:
获得第一个用于测试的值
当测试为真时
处理值
获取下一个值
6.2 while语句
通用格式如下:
while(expression)
statement
statement 可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句
从while开始执行到第一个分号结束,在使用复合语句的情况下,到右花括号结束
用while(goats)替换while(goats != 0),因为goats和goats !=0 只有在goats的值为0时才为0或假
如果待比较的一个值是常量,可以把该常量放在左侧有助于编译器捕获错误
5 = canoes //语法错误
5 == canoes //检查canoes的值是否为5
因为C语言不允许给常量赋值
6.3 用关系运算符和表达式比较大小
6.3.4 新的_Bool类型
_Bool是C语言中布尔变量的类型名
在C99标准中提供stdbool.h头文件,让bool成为_Bool的别名
#include<stdio.h>
#include<stdbool.h>
_Bool i; //不使用stdbool.h头文件时
bool i;
6.3.5 优先级和关系运算符
关系运算符的优先级比算数运算符低,比赋值运算符高
6.5 for循环
形式:
for(initialize; test; update)
statement
在test未加或0之前重复执行statement部分
for循环使用3个表达式控制循环过程,用分号隔开(可以省略一个或多个表达式,但不能省略分号)。initialize在执行for语句之前只执行一次;然后对test求值,如果表达式为真,执行循环一次;接着对update表达式求值,并再次检查test表达式。statement部分可以是一条简单的语句也可以是复合句。
6.7 逗号运算符
逗号运算符把两个表达式连接成一个表达式,并保证最左边的表达式最先求值。整个逗号表达式的值是逗号右侧表达式的值
a = (5,7);
//赋值给a的值是逗号右侧表达式的值,即7
6.8 出口条件循环:do while
while和for都是入口条件循环,有可能不执行循环体内容,do while为出口条件循环,保证至少执行循环体内容一次
do while循环通用格式:
do
statement
while(expression);
statement可以是简单语句也可以是复合语句,do while循环以分号结尾
在expression为假前重复执行循环体内容
6.10 嵌套循环
嵌套循环中的内层循环在每次外层循环迭代时都执行完所有循环。
6.11 数组简介
float debts[20];
debts是一个含20个元素的数组,每个元素都可以存储float类型的值。数组编号从0开始
//赋值
debts[5] = 10.1;
//读入
scanf("%f", &debts[8]);
可以把字符串存储在char类型的数组中,如果char类型数组末尾包含一个空字符\0,则数组内容构成一个字符串(既是字符数组,也是字符串)
第七章
7.2 if else 语句
通用形式:
if(expression)
statement1
else
statement2
7.2.1 getchar()和putchar()
对字符输入输出函数
ch = getchar();
与scanf("%c", &ch);效果相同
putchar(ch)
与printf("%c", ch)效果相同
7.2.2 ctype.h系列的字符函数
ctype.h头文件包含了一系列专门处理字符的函数
7.2.4 else与if配对
如果没有花括号,else与离它最近的if匹配
7.3 逻辑运算符
&& —— 与
|| —— 或
! —— 非
7.3.1 备选拼写:iso646.h头文件
传统写法 | iso646.h |
&& | and |
|| | or |
! | not |
7.3.2 优先级
!优先级高,大于乘法,与递增运算符相同,只比圆括号优先级低;&&比||优先级高,两者优先级比关系运算符低,比赋值运算符高
7.3.3 求值顺序
&&和||运算符都是序列点,程序在从一个运算符执行到下一个运算对象之前,所有副作用都会生效
while(x++ < 10 && x + y < 20)
在&&对右侧表达式求值之前,已经递增了x
7.5 条件运算符: ?:
条件运算符需要3个运算对象,每个运算对象都是一个表达式
条件表达式的通用形式如下:
expression1 ? expression2 :expression3
如果expression1为真,则整个条件表达式的值与expression2的值相同;如果为假,则表达式值与expression3的值相同
7.6 循环辅助:continue和break
3种循环都可以使用continue语句。执行到该语句时会跳过本次迭代的剩余部分,并开始下一轮迭代
对于for循环,执行continue后的下一个行为是对更新表达式求值,然后对循环测试表达式求值