C Primer Plus

第三章

3.4 C语言基本数据类型

3.4.1 int 类型

  1. 以十进制表示数字%d,以八进制表示数字%o,以十六进制表示数字%x

  1. 要显示各进制数的前缀,必须使用%#o,%#x

3.4.3 char类型

  1. 当使用Visual C++使用scanf时会出现C4996错误

解决方法:

  • 把每一个scanf()改为scanf_s

  1. 在使用关键字char前可加signed和unsigned,在char处理小整数时很有用,如果是处理字符则不用添加

  • signed char 范围是-128~127

  • unsigned char 范围是 0~255

  1. 非打印字符

3.4.6 float、double和long double

  1. 计数法示例

数字

科学计数法

指数计数法

123000

1.23×

1.23×

  1. float类型必须至少表示6位有效数字,double类型必须至少表示10位有效数字

通常情况下,float为32位,double为64位

  1. printf()函数使用%f转换说明打印十进制计数法的float和double类型浮点数,%e表示打印指数计数法的浮点数

  1. 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()函数

  1. strlen()函数给出字符串中的字符长度

  1. string.h头文件包含了strlen()函数和其他与字符串相关的函数

4.3 常量和C预处理器

  1. 格式:#define NAME value

注:

  • 其中没有=

  • 通常用大写表示符号常量(提高可读性)

  1. "%m.nf"

  • m:总宽度,包括小数点

  • n:小数部分位数

  • m>n+1, 也可以小于, 但编译结果会按实际数据输出

  • 如果m过大, 会在左边补空格

  1. #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()的*修饰符

  1. 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;
}
  1. 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 类型转换

类型转换规则

  1. char和short会被转换成int

  1. 涉及两种类型的运算,两个值会被分别转换为两种类型更高的级别

  1. 当作为函数参数传递时,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后的下一个行为是对更新表达式求值,然后对循环测试表达式求值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值