通过这一章,我们学会了:
1)ASCII 码的表示;
2)ASCII 码的运算;
3)ASCII 码的比较;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
(08)- 常量
一、常量简介
- C语言中的常量,主要分为以下几种类型:
二、数值常量
- 数值常量分为整数和浮点数,整数一般称为整型常量,浮点数则称为实型常量。
1、整型常量
- 整型常量分为二进制、八进制、十进制 和 十六进制。
- 每个整型常量分为三部分:前缀部分、数字部分、后缀部分。
- 如下表所示:
进制 | 前缀部分 | 数字部分 | 后缀部分 |
---|---|---|---|
二进制 | 0b |
0-1 |
u 、l 、ll |
八进制 | 0 |
0-7 |
u 、l 、ll |
十进制 | 无 | 0-9 |
u 、l 、ll |
十六进制 | 0x 或0X |
0-9 、a-f 、A-F |
u 、l 、ll |
- 关于前缀这部分,在 光天化日学C语言(06)- 进制转换入门 已经讲到过,就不再累述了。
- 这里着重提一下后缀,
u
(unsigned
)代表无符号整数,l
(long
)代表长整型,ll
代表long long
。
- 换言之,无符号整型就是非负整数。
- 待时机成熟,我会对整数的存储结构进行一个非常详细的介绍。
【例题1】说出以下整型常量中,哪些是非法的,为什么非法。
1314
520u
0xFoooooL
0XFeeeul
018888
0987UU
0520
0x4b
1024llul
30ll
030ul
2、实型常量
- 实型常量又分为 小数形式 和 指数形式。
1)小数形式
- 小数形式由三部分组成:整数部分、小数点、小数部分。例如:
3.1415927
4.5f
.1314
- 其中
f
后缀代表float
,用于区分double
。 .1314
等价于0.1314
。
2)指数形式
- 指数形式的典型格式为
xey
,如下:
1e9
5.2e000000
5.2e-1
1.1e2
- 它表示的数值是:
- x
×
1
0
y
x \times 10^{y}
x×10y
- 其中
y
y
y 代表的是数字10
的指数部分,所以是支持负数的。
三、字符常量
- 字符常量可以是一个普通的字符、一个转义序列,或一个通用的字符。
- 每个字符都对应一个 ASCII 码值。
1)普通字符
- 普通字符就是用单引号括引起来的单个字符,如下:
'a'
'Q'
'8'
'?'
'+'
' '
- 包含 26 个小写字母,26 个大写字母,10 个数字,几个标点符号,运算符等等。
- 具体参见:光天化日学C语言(07)- ASCII码。
2)转义字符
- 转义字符是用引号引起来,并且内容为 斜杠 + 字符,例如我们之前遇到的用
'\n'
代表换行,\t
代表水平制表符(可理解为键盘上的 tab 键),'\\'
代表一个反斜杠,等等; - 当然还可以用
'\ooo'
来代替一个字符,其中一个数字o
代表一个八进制数;也可以用'\xhh'
来代表一个字符,具体见如下代码:
#include <stdio.h>
int main() {
char a = 65;
char b = '\101';
char c = '\x41';
printf("%c %c %c\n", a, b, c);
return 0;
}
- 以上的代码输出结果为:
A A A
- 这是因为八进制下的
101
和十六进制的41
在十进制下都是65
,代表的是大写字母'A'
的ASCII 码值。
【例题1】请问如何输出一个单引号?
四、字符串常量
- 字符串常量,又称为字符串字面值,是括在双引号
""
中的。一个字符串包含类似于字符常量的字符:普通字符、转义序列。
1、单个字符串常量
#include <stdio.h>
int main() {
printf( "光天化日学\x43语言!\n" );
return 0;
}
- 我们可以用转义的
'\x43'
代表'C'
和其它字符组合,变成一个字符串常量。以上代码输出为:
光天化日学C语言!
【例题2】如果我想要如下输出结果,请问,代码要怎么写?
"光天化日学C语言!"
2、字符串常量分行
- 两个用
""
引起来的字符串,是可以无缝连接的,如下代码:
#include <stdio.h>
int main() {
printf(
"光天化日学"
"C语言!\n"
);
return 0;
}
- 这段代码的结果也是:
光天化日学C语言!
五、符号常量
1、#define
- 利用
#define
预处理器可以定义一个常量如下:
#include <stdio.h>
#define TIPS "光天化日学\x43语言!\n"
#define love 1314
int main() {
printf( TIPS );
printf("%d\n", love);
return 0;
}
- 以上这段代码,会将所有
TIPS
都原文替换为"光天化日学\x43语言!\n"
;将所有love
替换为1314
。
2、const
const
的用法也非常广泛,而且涉及到很多概念,这里只介绍最简单的用法,后面会开辟一个新的章节专门来讲它的用法。
#include <stdio.h>
const int love = 1314;
int main() {
printf( "%d\n", love );
return 0;
}
- 我们可以在普通变量定义前加上
const
,这样就代表它是个常量了,在整个运行过程中都不能被修改。
【例题3】下面这段代码会发生什么情况,自己编程试一下吧。
#include <stdio.h>
const int love = 1314;
int main() {
love = 520;
printf( "%d\n", love );
return 0;
}
- 通过这一章,我们学会了 各种类型 的常量,希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
第二章
运算符和表达式
(09)- 算术运算符
一、算术运算符
- 算术运算符主要包含以下几个:
- 1)四则运算符,也就是数学上所说的加减乘除;
- 2)取余符号;
- 3)自增和自减。
- 那么接下来让我们一个一个来看看吧。
1、四则运算符
- 数学上的加减乘除和C语言的加减乘除的含义类似,但是符号表示方法不尽相同,对比如下:
/ | 加法 | 减法 | 乘法 | 除法 |
---|---|---|---|---|
数学 | + | - |
×
\times
× | ÷ |
| C语言 | + | - | * | / |
1)加法
a + b
代表两个操作数相加,代码如下:
#include <stdio.h>
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a + b = %d\n", a + b );
printf("c + d = %.3lf\n", c + d);
printf("a + c = %.3lf\n", a + c);
return 0;
}
- 这段代码的输出为:
a + b = 3
c + d = 3.000
a + c = 2.005
2)减法
a - b
代表从第一个操作数中减去第二个操作数,代码如下:
#include <stdio.h>
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a - b = %d\n", a - b );
printf("c - d = %.3lf\n", c - d);
printf("a - c = %.3lf\n", a - c);
return 0;
}
- 这段代码的输出为:
a - b = -1
c - d = -0.990
a - c = -0.005
3)乘法
a * b
代表两个操作数相乘,代码如下:
#include <stdio.h>
int main() {
int a = 1, b = 2;
double c = 1.005, d = 1.995;
printf("a \* b = %d\n", a \* b);
printf("c \* d = %.3lf\n", c \* d);
printf("a \* c = %.3lf\n", a \* c);
return 0;
}
- 这段代码的输出为:
a \* b = 2
c \* d = 2.005
a \* c = 1.005
4)除法
不同类型的除数和被除数会导致不同类型的运算结果。
1)当 除数 和 被除数 都是整数时,运算结果也是整数;
1.a)如果能整除,结果就是它们相除的商;
1.b)如果不能整除,那么就直接丢掉小数部分,只保留整数部分,即数学上的 取下整;
2)除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
- 我们来看一段代码:
#include <stdio.h>
int main() {
int a = 6, b = 3, c = 4;
double d = 4;
printf("a / b = %d\n", a / b );
printf("a / c = %d\n", a / c);
printf("a / d = %.3lf\n", a / d);
return 0;
}
- 输出结果如下:
a / b = 2
a / c = 1
a / d = 1.500
a
能被整除b
,所以第一行输出它们的商,即2
;a
不能被整除c
,所以第二行输出它们相除的下整,即1
;a
和d
中,d
为浮点数,所以相除得到的也是浮点数;
#include <stdio.h>
int main() {
int a = 5, b = 0;
int c = a / b;
return 0;
}
- 这里会触发一个异常,即 除零错。这种情况在 C语言中是不允许的,但是由于变量的值只有在运行时才会确定,编译器是没办法帮你把这个错误找出来的,平时写代码的时候一定要注意。
2、取余符号
- 取余,也就是求余数,使用的运算符是
%
。C语言中的取余运算只能针对整数,也就是说,%
两边都必须是整数,不能出现小数,否则会出现编译错误。 - 例如:
5 % 3 = 2
、7 % 2 = 1
。
当然,余数可以是正数也可以是负数,由
%
左边的整数决定:
1)如果%
左边是正数,那么余数也是正数;
2)如果%
左边是负数,那么余数也是负数。
- 我们继续来看一段代码:
#include <stdio.h>
int main()
{
printf(
"9%%4=%d\n"
"9%%-4=%d\n"
"-9%%4=%d\n"
"-9%%-4=%d\n",
9%4,
9%-4,
-9%4,
-9%-4
);
return 0;
}
- 在 光天化日学C语言(08)- 常量 这一章中,我们提到的两个用
""
引起来的字符串是可以无缝连接的,所以这段代码里面四个字符串相当于一个。而%
在printf
中是用来做格式化的,所以想要输出到屏幕上,需要用%%
。于是,我们得到输出结果如下:
9%4=1
9%-4=1
-9%4=-1
-9%-4=-1
- 印证了最后的符号是跟着左边的数走的。
3、自增和自减
- 自增和自减的情况类似,所以我们只介绍自增即可。
x = x + 1;
- 我们也可以写成:
x++;
- 当然,也可以写成:
++x;
- 这两者的区别是什么呢?我们来看一段代码:
#include <stdio.h>
int main()
{
int x = 1;
printf( "x = %d\n", x++ );
printf( "x = %d\n", x );
return 0;
}
- 输出结果是:
x = 1
x = 2
- 这是因为
x
在自增前,就已经把值返回了,所以输出的是原值。我们再来看另一种情况:
#include <stdio.h>
int main()
{
int x = 1;
printf( "x = %d\n", ++x );
printf( "x = %d\n", x );
return 0;
}
- 输出结果是:
x = 2
x = 2
- 这是因为
x
先进行了自增,再把值返回,所以输出的是自增后的值。 - 当然,自减也是同样的道理,大家可以自己写代码实践一下。
通过这一章,我们学会了:
1)四则运算符;
2)取余运算符;
3)自增和自减运算符;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
- 【第01题】A + B | 四种输入方式,开启刷题的序章
- 【第02题】给定 n,求 1 + 2 + 3 + … + n 的和 | 四种解法
- 【第07题】给定 n,求 1 × 2 × 3 × … × n 的乘积 | 两种解法
(10)- 关系运算符
一、关系运算符
1、概览
- 关系运算符是用来判断符号两边的数据的大小关系的。
- C语言中的关系运算符主要有六个,如下:
2、表示方式
- C语言中的关系运算符和数学中的含义相同,但是表示方法略有不同,区别如下:
关系运算符释义 | C语言表示 | 数学表示 |
---|---|---|
大于 | > | > |
大于等于 | >= | ≥ |
等于 | == | = |
不等于 | != | ≠ |
小于 | < | < |
小于等于 | <= | ≤ |
- 关系运算符的两边可以是变量、数值 或 表达式,例如:
1)变量
- a > b
- a != b
2)数值
- 3 > 5
- a == 6
3)表达式
- a + b > 4
- a > a + b
二、关系运算符的应用
1、运算结果
- 关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。
- 我们来看一段代码,如下:
#include <stdio.h>
int main() {
printf("%d\n", 1 > 2);
printf("%d\n", 1 < 2);
return 0;
}
- 得到的输出结果为:
0
1
- 原因就是
1 > 2
在数学上是不成立的,所以结果为0
;而1 < 2
在数学上是不成立的,所以结果为1
;
2、运算符嵌套
- 关系运算符是允许嵌套使用的,即运算的结果可以继续作为关系运算符的运算参数,例如以下代码:
#include <stdio.h>
int main() {
printf("%d\n", 1 > 2 > -1);
return 0;
}
- 输出结果是多少呢?
- 由于
1 > 2
的结果为0
,所以1 > 2 > -1
等价于0 > -1
,显然是成立的,所以输出的结果为:
1
- 有关于结合性的内容,会在运算符的内容都讲完后,就运算符优先级和运算符结合性进行一个统一讲解,现在这个阶段,你只需要知道,关系运算符都是左结合,即存在多个运算符,有没有括号的情况下,一律从左往右计算。
【例题1】给出以下代码,问输出的结果是什么。
#include <stdio.h>
int main() {
printf("%d\n", 1 < 2 > 1);
printf("%d\n", 3 > 2 > 1);
return 0;
}
3、运算符优先级
!=
和==
的优先级低于>
,<
,>=
,<=
。- 优先级是什么呢?
- 看个例子就能明白。
#include <stdio.h>
int main() {
printf("%d\n", 1 < 2 == 1);
return 0;
}
- 我们可以做出两种假设:
- 假设1:
==
优先级低于<
;1 < 2
优先计算,则表达式等价于1 == 1
,成立,输出1
。 - 假设2:
==
优先级高于<
;2 == 1
优先计算,则表达式等价于1 < 0
,不成立,输出0
。 - 实际上,这段代码的结果为:
1
- 即
==
的优先级低于<
,当然,同学们可以试下!=
和其它符号的关系。
- 另外,关系表达式会进场用在条件判断
if
语句中,例如:
if(a < b) {
// TODO
}
- 我们会在将
if
语句的时候继续复习关系运算符相关的知识哦~
4、== 和 =
- 初学者最容易犯的错是把
==
和=
搞混,前者是判断相等与否,而后者是赋值。 - 看一段代码,就能知道:
#include <stdio.h>
int main() {
int a = 0;
printf("%d\n", a = 0);
printf("%d\n", a == 0);
return 0;
}
- 以上这段代码的输出结果是:
0
1
- 神不神奇,意不意外?!
通过这一章,我们学会了:
1)6种关系运算符;
2)关系运算符的嵌套;
3)关系运算符的优先级;
- 希望对你有帮助哦 ~ 当然,要多写代码尝试下文中提到的各种情况哦,祝大家早日成为 C 语言大神!
课后习题
(11)- 逻辑运算符
一、逻辑运算符
1、概览
- 逻辑运算符是用来做逻辑运算的,也就是我们数学中常说的 “与或非”。
- C语言中的逻辑运算符主要有三个,如下:
2、表示方式
- C语言中的逻辑运算符和数学中的含义类似,但是表示方法截然不同,对应关系如下:
逻辑运算符释义 | 操作数个数 | C语言表示 | 数学表示 |
---|---|---|---|
与 | 二元操作符 | && |
∧
\land
∧ |
| 或 | 二元操作符 | ||
|
∨
\lor
∨ |
| 非 | 一元操作符 | !
|
¬
\lnot
¬ |
- 二元操作符的操作数是跟在符号两边的,而一元操作符的操作数则是跟在符号右边的。
- 逻辑运算符的操作数可以是变量、数值 或 表达式。例如:
1)变量
- a && b
- a || b
- !a
2)数值
- a && 520
- 1314 || 520
- !0
3)表达式
- a + b && c + d
- a + b || c + d
- !(a + b)
二、逻辑运算符的应用
1、运算结果
1)与运算(&&)
对于与运算,参与运算的操作数都为 “真” 时,结果才为 “真”,否则为 “假”。
#include <stdio.h>
int main() {
printf("%d\n", 0 && 0); // 0
printf("%d\n", 5 && 0); // 0
printf("%d\n", 0 && 5); // 0
printf("%d\n", 5 && 9); // 1
return 0;
}
- 注释中的内容,就是实际输出的内容。
- 我们发现,无论操作数原本是什么,程序只关心它是 “零” 还是 “非零”。然后根据
&&
运算符自身的运算规则进行运算。
2)或运算(||)
对于或运算,参与运算的操作数都为“假”时,结果才为“假”,否则为“真”。
#include <stdio.h>
int main() {
printf("%d\n", 0 || 0); // 0
printf("%d\n", 5 || 0); // 1
printf("%d\n", 0 || 5); // 1
printf("%d\n", 5 || 9); // 1
return 0;
}
- 注释中的内容,就是实际输出的内容。
- 我们同样发现,无论操作数原本是什么,程序只关心它是 “零” 还是 “非零”。然后根据
||
运算符自身的运算规则进行运算。
3)非运算(!)
对于非运算,操作数为 “真”,运算结果为 “假”;操作数为 “假”,运算结果为 “真”;
#include <stdio.h>
int main() {
printf("%d\n", !0); // 1
printf("%d\n", !5); // 0
return 0;
}
- 注释中的内容,就是实际输出的内容。
- 八个字概括:非真即假,非假即真。
2、运算符嵌套
- 和 关系运算符 一样,逻辑运算符也是可以支持嵌套的,即运算结果可以继续作为逻辑运算符的操作数,例如如下代码:
#include <stdio.h>
int main() {
int a = !( (5 > 4) && (7 - 8) && (0 - 1) );
printf("%d\n", a);
return 0;
}
(5 > 4)
和(7 - 8)
这两个表达式进行与运算,等价于:1 && 1
,结果为1
。1
和(0 - 1)
继续进行与运算,等价于1 && 1
,结果为1
。- 对
1
进行非运算,得到结果为0
。 - 所以这段代码最后输出的结果为:
0
3、运算符优先级
- 接下来,我们看下三个运算符混合运用的情况,对于如下代码:
#include <stdio.h>
int main() {
int a = !( 1 || 1 && 0 );
printf("%d\n", a);
return 0;
}
- 这个问题的答案是:
0
- 我们再来看个例子,区别只是在
1 || 1
的两边加上一个括号。
#include <stdio.h>
int main() {
int a = !( (1 || 1) && 0 );
printf("%d\n", a);
return 0;
}
- 现在输出的答案变成了:
1
- 这是为什么呢?
- 因为
&&
的优先级是比||
要高的,所以在没有任何括号的情况下,&&
会优先计算,简而言之,对于刚才的( 1 || 1 && 0 )
,我们把它等价成( 1 || (1 && 0) )
,这样是不是就好理解了。 - 用类似的方法,我们可以得到
!
的优先级是最高的,所以这三个符号的优先级排序如下: - ∣
∣
<
&
&
<
!
|| \ < \ && \ < \ !
∣∣ < && < !
- 当然,后面的章节,我们会对 算术运算符、关系运算符、逻辑运算符 等等所有的运算符的优先级 和 结合性 进行一个梳理,尽情期待 ~~
通过这一章,我们学会了:
1)与运算:有假必假;
2)或运算:有真必真;
3)非运算:非真即假,非假即真;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
(12)- 类型转换