大家好,很高兴又和各位见面了,在开始今天的内容前,我们先解决前面在初识C语言15中留下的几道题,通过这些题目来帮助各位复习一下操作符的相关知识。
//题目1:
int a = 1, b = 2, c;
c = a ^ b << 1;
printf("%d\n", c);
求c的输出值。
【分析】我们在看到这道题后要先知道它考察了哪些内容——按位异或、左移以及操作符使用的优先级顺序。
这里按位异或运算的运算规则是操作对象的同位二进制序列遵循,只有一真一假输出结果为1,否则输出结果为零;
左移的运算规则是操作对象的二进制序列在给定区域中整体往左移动,移动出去的二进制序列被舍弃,空缺部分用0补上;
操作符的使用优先级顺序如下:
这里我们可以看到移位操作符的优先级>按位与的优先级>按位异或的优先级>按位或的优先级,也就是说在这道题目中我们应该先运算b<<1,然后再运算a与b<<1的按位异或。
【解题】第一步写出各自的二进制序列,及移位后的二进制序列:
int b=2,其二进制序列为|00000000000000000000000000000010|
b << 1 ,其二进制序列为|00000000000000000000000000000100|
int a=1,其二进制序列为|00000000000000000000000000000001|
第二部,进行按位异或运算
a ^ b << 1,其二进制序列为|00000000000000000000000000000101|
第三部,转化为十进制
|00000000000000000000000000000101|—>1*2^0+0*2^1+1*2^2=5
【验算】这里我通过VS进行检验
下面我们来看看下面的题:
//题目2
int x = 5, y = 5, i;
for( i = 0; x > 3; y = ++i)
printf("%d %d", x--, y);
求输出结果是多少?
//题目3
int x = 5, y = 5, i;
for( i = 0; x > 3; y = ++i)
printf("%d %d", --x, y);
求输出结果是多少
【分析】题目2和题目3考察的是for循环的运算顺序以及前置--与后置--的区别
for循环的语句结构为:
for(1;2;3)//1——变量;2——判断条件;3——递进方式
{
4;//4——满足条件时执行操作;
}
运算顺序为:1-2-4-3-2-4-3-2-4-3……直到不满足条件跳出循环
前置--:先--再使用;
后置--:先使用,再--;
根据以上条件我们可以得知这两题的运算顺序分别是:
//题目2
x = 5, y = 5;
i = 0
5 > 3,满足条件
打印x=5,打印y=5
x--//x=5-1=4
y = ++i//y=0+1=1
4 > 3,满足条件
打印x=4,打印y=1
x--//x=4-1=3
y = ++i//y=1+1=2
3 > 3,不成立,跳出循环
//题目3
x = 5, y = 5;
i = 0
5 > 3,满足条件
--//x=5-1=4
打印x=4,打印y=5
y = ++i//y=0+1=1
4 > 3,满足条件
--x//x=4-1=3
打印x=3,打印y=1
y = ++i//y=1+1=2
3 > 3,不成立,跳出循环
【解题】由上述分析可知题目2的最终结果是5 5 4 1,题目3的最终结果是4 5 3 1
【验算】
相信大家在做完这两题后对这些考察内容的理解应该更加深刻了,接下来我们将进入今天的正题——#define定义常量和宏
#define定义常量和宏
1.#define定义的标识符常量
在我们分享常量的时候有提到过#define定义的标识符常量不知道大家还有没有印象。感兴趣的朋友可以回顾一下初识C语言6,这里面有详细介绍#define定义的标识符常量及其用法,我就不再多加叙述了。现在我们来对这个知识点做个总结:
1.#define定义的标识符常量是一个常量,只不过相比于1/2/3这样的可以直观看到的常量来说,它是一个标识符,并且它可以在数组中使用;
2.#define定义标识符常量的格式是:
#define 标识符 大小;//这里和变量有所不同的是,这里不需要赋值符号,三者之间用空格隔开;
2.#define定义的宏
我们首先要知道什么是宏:宏是一种批量处理的称谓。这里我们可以理解为是一种指令,就比如我们要炒一盘菜,炒菜的顺序就是起锅烧油,葱姜蒜搞里头,食材搞里头,调味料搞里头,搁楞搁楞,将其翻炒均匀,然后出锅。这里起锅烧油、放葱姜蒜、放食材、放调味料、翻炒……这一系列动作,我们就可以把它称之为炒菜,每单我们发出炒菜这个指令时,我们就要执行这些动作,那类比到计算机中,炒菜就是宏,炒菜时做出的一系列动作就是我们在使用宏时计算机会做出的一系列操作。
#define定义的宏,它是在#define定义的标识符常量的基础上,增加了参数,与咱们的自定义函数有点相似。下面我们来分别使用宏和函数来完成输出最大值的指令,以此来更进一步理解宏,代码如下;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//自定义函数
int A(int x, int y)
{
if (x > y)
{
return x;
}
else
return y;
}
//定义宏
#define B(x,y) (x>y?x:y)
int main()
{
int a = 10, b = 20;
int max = A(a, b);
printf("max=%d\n", max);
max = B(a, b);
printf("max=%d\n", max);
return 0;
}
这里我们分别定义了函数A和宏B来进行比大小的指令,下面我们来运行一下,看看结果如何:
这里我们可以看到的是,两种方式输出的结果是一样的,但是我们发现,用宏定义时,要比使用函数更加简洁。
下面我们来给#define定义宏做个总结:
1.#define定义宏的结构:
#define 标识符(参数) (需要完成的指令)//这里有几点需要注意:
//1.#define在定义宏时由四部分组成:#define、标识符、参数、需要完成的指令;
//2.这四部分中标识符与参数之间不需要用空格隔开,但是参数需要在外面带上括号;
2.在定义宏时,参数不需要带类型;
3.在使用宏时和函数调用一样,需要使用标识符及参数。
这里我要提一嘴,还记不记得我们在分享C语言过程中接触到的第一个宏是什么?没错,就是咱们代码的第一行#define _CRT_SECURE_NO_WARNINGS 1,还记得它的作用是什么吗?它是在我们使用scanf、strlen……这里C语言提供的这些不安全的库函数时,使计算机忽略它们并不再报错的指令。现在大家对它为什么能解决这个报错问题应该更加清晰了吧。
今天的内容到这里就结束了,希望这篇内容能够帮助大家更好的去理解这些知识点,接下来随着学习的深入,我会继续给大家分享我在学习过程中的感受,感谢大家的翻阅,咱们下一篇见。