2. 逻辑、关系运算。
提起什么逻辑运算,或者什么关系运算,看名字貌似很复杂的。不过这里可能让大家放心的是,这些运算我们日常生活中经常用到,无非就是 真的,假的,是,不是,并且,或者之类的操作。
用于逻辑运算的运算符有如下几个:
运算符 | 含义 |
&&
| 与(并且) |
||
| 或(或者) |
!
| 非(不是) |
用于关系运算的运算符有如下几个:
这些运算无非就是为了判断一个表达式成立不成立,在C语言中,只要表达式的值不为零并且符合关系运算符的要求,那这个表达式就成立的,就可以用上述的两种运算符进行比较运算,一般情况下,这些运算符会配合下节我们要讲述的流程控制语句来使用,所以这里我就不给出具体用法的例子了,有情趣的朋友,可以继续看下面章节中的例子
到现在我想主要的运算我都讲完了,虽然不是很详细,但是我想,只要大家坚持努力,多多百度,这些知识一定会掌握好的。
小学的时候,我们学过四则运算,在运算的时候,遵循先乘除,后加减,有括弧的先算括弧里面的,这个规则在这里一样使用,只不过在编程环境中,运算符很多,所以需要有个更为详细的运算符优先级表。这里我把它贴出来,但是还希望大家能够尽量的使用括弧来让人看的容易,以免出错,具体优先级表转载如下:
更详细的用法可以参考如下链接:
二、 三种程序流程控制结构详解。
有了上述的运算,我想大家都可以写出一些很简单的代码了,但是我们在写代码的时候,肯定会遇到类似这样的问题:
Ø 有时候,我们写的代码必须要在达到某种条件之后才可以执行,否则不让运行。
Ø 有时候,我们写的代码很庞大,很罗嗦,因为它有几种可能需要我们来写出几个程序。
Ø 有时候,我们写的代码需要一直重复执行直到某种条件不成立了才不执行。
只要你遇到过上述的问题,那我们这节课的内容就正是你所需要的。不多废话,进入正题:
1. 顺序结构
到现在为止,我们写的所有的代码都是顺序结构的,所谓顺序结构,就是代码从第一条指令开始执行,直到执行完最后一条。中间不会落下任何一条指令。
想必大家现在应该能理解什么是顺序结构了,所以我不想再这里浪费太多的篇幅,直接进入下一小节。
2. 分支结构
所谓分支结构,就是代码在达到某种条件的时候,执行某些指令,否则就执行别的指令。
分支结构是改变代码执行顺序最简单的方式,所以大家一定可以很容易的掌握它的,下面让我们一个一个的来看。
a) if … else结构
这个结构算是编程中最基础的结构了,它有三种格式,我在这里列出来,大家可以根据实际情况选择使用哪个:
第一种格式:
if (条件表达式)
{
//条件成立时执行这里的语句
…
}
第二种格式:
if (条件表达式)
{
//条件成立时执行这里的语句
…
}
else
{
//条件不成立时执行这里的语句
…
}
第三种格式:
if (条件表达式1)
{
//条件表达式1成立时执行这里的语句
…
}
else if (条件表达式2) // 这里的else if可以有无限多个(如果有很多个时可以参考使用switch语句)。
{
//条件表达式2成立时执行这里的语句
…
}
else
{
//条件表达式都不成立时执行这里的语句
…
}
为了更好的说明这个语句的用法,我举个例子:
int MaxNum(int num001, int num002, int num003)
{
if (num001 >= num002)
{
if (num001 >= num003)
{
return num001; // 将 num001 作为函数的结果返回出来。
}
else
{
return num003;
}
}
else
{
if (num002 >= num003)
{
return num002;
}
else
{
return num003;
}
}
}
说明:上述代码中的功能是从提供的三个数:num001、num002、num003中选出最大的数来。
至于与这些if有关的汇编指令就是跳转,像sub,cmp,test,之类的比较指令来影响相应的标志寄存器还有JE,JNE,JB,JNB之类的跳转指令来跳转到指定的代码中执行,大家可以像我们分析算术运算的方式一样,去调试它,去分析它,去掌握这些比较和跳转指令的用法。
这里我就省下篇幅,继续我们的switch结构。
b) switch … 结构
上小节中讲述的if语句,是用于少数分支时的处理语句,它写起来方便,代码简洁明了,但是如果一些表达式的结构可能有5种甚至更多种结果,需要我们分别作出不同的处理时,最好的选择就是用wsitch语句。
先说明一下switch结构的语法格式:
switch(表达式结果或者存放结果的变量)
{
case 结果1:
// 当switch后的括弧中的值是结果时,就执行这里的语句
...;
break; // break是用来跳出分支结构的关键字,如果这里没有它,只要结果是结果1,那从结果1开始向下的所有指令都会被执行(包括结果2,结果3……)。
case 结果2:
// 当switch后的括弧中的值是结果时,就执行这里的语句
...;
break; // 如果这里没有这个关键字时,只要上面的结果是结果2,那从结果2开始向下的所有指令都会被执行(包括结果3,结果4……)。
case 结果3:
// 当switch后的括弧中的值是结果时,就执行这里的语句
...;
break; // 同上
case 结果N:
// 当switch后的括弧中的值是结果N时,就执行这里的语句
...;
break;
default:
// 当switch后的括弧中的值不是上面列出的任何一个值时,就执行这里的语句
...;
}
这里写的可能有点模糊,我给出一个代码片段,我说明一下switch语句的用法:
PGAME_CHAR_INFO pGCI = GetCharInfoPoint();
switch (pGCI->dwZhiYe)
{
case 1:
lstrcpyW(szTemp, L"灵剑\0");
break;
case 2:
lstrcpyW(szTemp, L"日羽\0");
break;
case 3:
lstrcpyW(szTemp, L"枪侠\0");
break;
case 4:
lstrcpyW(szTemp, L"萨满\0");
break;
case 5:
lstrcpyW(szTemp, L"法皇\0");
break;
case 6:
lstrcpyW(szTemp, L"药王\0");
break;
default:
lstrcpyW(szTemp, L"未知\0");
break;
}
其实,这个switch的汇编形式跟if结构很像,唯一的区别就是每个分支后面都会有一个break跳转(JMP)指令,大家可以自己试着去调试这段代码,分析一下尽量掌握这些代码的汇编形式。
转自: