《C语言动漫对话教程(入门篇)》_int a=2 a百分号等于4-1则表达式a加等于a乘等于a减等于a乘于三(1)

通过这一章,我们学会了:
  1)ASCII 码的表示;
  2)ASCII 码的运算;
  3)ASCII 码的比较;

  • 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!

课后习题

在这里插入图片描述


(08)- 常量

一、常量简介

  • C语言中的常量,主要分为以下几种类型:

二、数值常量

  • 数值常量分为整数和浮点数,整数一般称为整型常量,浮点数则称为实型常量。

1、整型常量

  • 整型常量分为二进制、八进制、十进制 和 十六进制。
  • 每个整型常量分为三部分:前缀部分、数字部分、后缀部分。
  • 如下表所示:
进制 前缀部分 数字部分 后缀部分
二进制 0b 0-1 ulll
八进制 0 0-7 ulll
十进制 0-9 ulll
十六进制 0x0X 0-9a-fA-F ulll

  • 换言之,无符号整型就是非负整数。
  • 待时机成熟,我会对整数的存储结构进行一个非常详细的介绍。

【例题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'
	'?'
	'+'
	' '

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
  • ad中,d为浮点数,所以相除得到的也是浮点数;

#include <stdio.h>
int main() {
    int a = 5, b = 0;
    int c = a / b;
    return 0;
}

  • 这里会触发一个异常,即 除零错。这种情况在 C语言中是不允许的,但是由于变量的值只有在运行时才会确定,编译器是没办法帮你把这个错误找出来的,平时写代码的时候一定要注意。

2、取余符号

  • 取余,也就是求余数,使用的运算符是%。C语言中的取余运算只能针对整数,也就是说,%两边都必须是整数,不能出现小数,否则会出现编译错误。
  • 例如:5 % 3 = 27 % 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 语言大神!

课后习题

在这里插入图片描述


(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)- 类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值