【速读C primer plus】第七章

一、getchar()与putchar()

​ getchar()与putchar()只能处理字符类型,所以在接收量为int、char等整型时,默认作为字符类型处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x;
x = getchar();
printf("%d\n",x);
putchar(x);
}
//输入:2
//输出:
//50
//2

​ getchar()处理浮点型变量时,会在接收时发生截断,并且尝试使用字符来解释。

1
2
3
4
输入:2.3
输出:
50.000000
2

​ 当接收值完全超出ascii范围,则getchar()只会接收第一个值作为字符变量(尝试将接收值理解为字符串,只取句首第一个字符)。

1
2
3
4
输入:5550
输出
53
5

​ putchar只能输出单个字符串,当输出值是整型会根据ascii码转化为字符,当输出值为浮点时,会发生截断然后再尝试解释为ascii码表上的字符。

1
2
3
4
5
6
7
8
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
float x=98.4;
putchar(x);
}
//输出:b

※注意:不要拿getchar()为int类型数字赋值,因为接收值只能被理解为字符,会导致接收值与实际携带值不同。

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x;
x=getchar();
printf("%d,%c",x,x);
}
//输入:4
//输出:52,4

二、字符测试工具:ctype.h

​ C语言有自带的内置字符处理头文件,根据内部的这些函数可以快速处理或者测试字符。

函数名 如果是以下参数时,返回值为真
isalnum() 字母数字(字母或者数字)
isalpha() 字母
isblank() 标准空白字符(空格、水平制表符或换行符)
iscntrl() 控制字符,如ctrl+B
isdigit() 数字
isgraph() 除空格之外的任何可打印字符
islower() 小写字母
isprint() 可打印字符
ispunct() 标点符号(除空格、字母数字以外的任何可打印字符)
isspace() 空白字符(空格、换行符、换页符、回车符、垂直制表符、水平制表符)
isupper() 大写字母
isxdigit() 十六进制数字符
(映射函数)tolower() 如果参数是大写字母则返回小写,否则返回原始参数
(映射函数)toupper() 如果参数是小写字母则返回大写,否则返回原始参数

三、逻辑运算踩坑

1)优先级

​ 1.非运算符号(!)的优先级小于乘法(*),但和圆括号的优先级相同,是逻辑运算符中优先级最高的。

​ 2.与运算(&&)的优先级高于或运算(||),所以连用请小心运算顺序。

3.&&与||的连接符都是序列点,导致在经过他们之前会将前面变量的后缀递增地减符运行

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x=9;
if (x++ < 10 && x + 1 == 11)
printf("运算成立");
}
//输出:运算成立
1
2
3
4
5
6
7
8
9
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x=9;
if (x++ > 10 || x + 1 == 11)
printf("运算成立");
}
//输出:运算成立

2)逻辑短路

​ 笔者测试的时候发现vs的C语言修复了逻辑短路问题。大致说一下原理:在逻辑计算时,程序会偏向快速计算问题:

1
2
3
c=1
if(c||c=2)
printf("%c",c);

​ 在支持逻辑短路问题的编译器中,输出结果应该是1而非2。因为对于或运算来说,只要第一个为真,则后面连接符会被跳过,因为他的真假不会影响逻辑表达式的结果,同理与运算第一个为假也不会继续进行第二个表达式的处理。

​ 由于C语言支持了逻辑运算中使用等号,所以会出现这种逻辑短路现象。逻辑短路并非是标准中的,所以有些没有逻辑运算优化并且支持逻辑运算内表达式赋值的编译器内写这种语句会出现逻辑短路现象。

四、条件表达式

1
判定式?为真表达式:为假表达式

​ 这种一般作为判定框内部的判定语句,一般前面会有赋值符号链接,并且常和逗号运算符连用。

​ 冷门语句,记住用发夹就行,判定式为真表达式结果是为真表达式的结果,否则是为假表达式结果。