C++程序的执行顺序结构以及关系和逻辑运算符讲解

 更新时间:2020年4月25日 17:37  点击:2127

C++顺序结构程序
【例】求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac≥0。根据求x1,x2的算法。它可以编写出以下C++程序:

#include <iostream>
#include <cmath> //由于程序要用到数学函数sqrt,故应包含头文件cmath
using namespace std;
int main( )
{
 float a,b,c,x1,x2;
 cin>>a>>b>>c;
 x1=(-b+sqrt(b*b-4*a*c))/(2*a);
 x2=(-b-sqrt(b*b-4*a*c))/(2*a);
 cout<<"x1="<<x1<<endl;
 cout<<"x2="<<x2<<endl;
 return 0;
}

运行情况如下:

4.5 8.8 2.4 ↙
x1=-0.327612
x2=-1.17794

如果程序中要用到数学函数,都要包含头文件cmath(也可以用老形式的头文件math.h,但提倡使用C++新形式的头文件)。在写程序时,一定要注意将数学表达式正确地转换成合法的C++表达式。

可以看到:顺序结构的程序中的各执行语句是顺序执行的。这种程序最简单,最容易理解。

C++关系运算和逻辑运算(关系运算符和逻辑运算符)
往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购物在1000元以下的打九五折,1000元及以上的打九折。

C++提供if语句来实现这种条件选择。如:

  if amount<1000 tax=0.95; //amount代表购物总额,tax代表折扣
  else tax=0.9; //若amount<1000,条件满足,tax=0.95,否则tax=0.9
  pay=amount*tax; //pay为实付款

关系运算和关系表达式

上面if语句中的“amount<1000”实现的不是算术运算,而是关系运算。实际上是比较运算,将两个数据进行比较,判断比较的结果。“amount<1000”就是一个比较式,在高级语言中称为关系表达式,其中“>”是一个比较符,称为关系运算符。

C++的关系运算符有:

  •     <    (小于)
  •     <=        (小于或等于)           优先级相同 (高)
  •     >    (大于)
  •     >=        (大于或等于) 
  •     ==        (等于)
  •     !=       (不等于)           优先级相同 (低)

关于优先次序:
前4种关系运算符(<,<=,>,>=)的优先级别相同,后两种也相同。前4种高于后两种。例如,“>”优先于“==”。而“>”与“<”优先级相同。
关系运算符的优先级低于算术运算符。
关系运算符的优先级高于赋值运算符。

例如:

  • c>a+b 等效于 c>(a+b)
  • a>b==c等效于(a>b)==c
  • a==b<c等效于a==(b<c)
  • a=b>c 等效于a=(b>c)

用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的一般形式可以表示为:

  表达式 关系运算符 表达式

其中的“表达式”可以是算术表达式或关系表达式?逻辑表达式?赋值表达式?字符表达式。例如,下面都是合法的关系表达式:

  a>b, a+b>b+c,(a==3)>(b==5), 'a'<'b', (a>b)>(b<c)

关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5==3”的值为“假”,“5>=0”的值为“真”。在C和C++中都用数值1代表“真”,用0代表“假”。如果有以下赋值表达式:

  •     d=a>b 则d得到的值为1
  •     f=a>b>c  f得到的值为0

逻辑常量和逻辑变量

C语言没有提供逻辑型数据,关系表达式的值(真或假)分别用数值1和0代表。C++增加了逻辑型数据。逻辑型常量只有两个,即false(假)和true(真)。

逻辑型变量要用类型标识符bool来定义,它的值只能是true和false之一。如

  bool found, flag=false; //定义逻辑变量found和flag,并使flag的初值为false
  found=true; //将逻辑常量true赋给逻辑变量found

由于逻辑变量是用关键字bool来定义的,因此又称为布尔变量。逻辑型常量又称为布尔常量。所谓逻辑型,就是布尔型。

设立逻辑类型的目的是为了看程序时直观易懂。

在编译系统处理逻辑型数据时,将false处理为0,将true处理为1。因此,逻辑型数据可以与数值型数据进行算术运算。

如果将一个非零的整数赋给逻辑型变量,则按“真”处理,如

  flag=123; //赋值后flag的值为true
  cout<<flag;

输出为数值1。
逻辑运算和逻辑表达式

有时只用一个关系表达式还不能正确表示所指定的条件。

C++提供3种逻辑运算符:
(1) &&  逻辑与(相当于其他语言中的AND)
(2) ||  逻辑或(相当于其他语言中的OR)
(3) !逻辑非(相当于其他语言中的NOT)

逻辑运算举例如下:

  • a && b若a,b为真,则a && b为真。
  • a||b  若a,b之一为真,则a||b为真。
  • !a 若a为真,则!a为假。

在一个逻辑表达式中如果包含多个逻辑运算符,按以下的优先次序:
(1) !(非)→ &&(与)→ ?(或),即“!”为三者中最高的。
(2) 逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。

例如:

  • (a>b) && (x>y)  可写成 a>b && x>y
  • (a==b) || (x==y)  可写成 a==b || x==y
  • (!a) || (a>b)可写成 !a || a>b

将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式,上面几个式子就是逻辑表达式。逻辑表达式的一般形式可以表示为

  表达式 逻辑运算符 表达式

逻辑表达式的值是一个逻辑量“真”或“假”。前面已说明,在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个逻辑量是否为“真”时,采取的标准是: 如果其值是0就认为是“假”,如果其值是非0就认为是“真”。例如:
(1) 若a=4,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0代表。
(2) 若a=4,b=5,则a && b的值为1。因为a和b均为非0,被认为是“真” 。
(3) a,b值同前,a-b||a+b的值为1。因为a-b和a+b的值都为非零值。
(4) a,b值同前,!a || b的值为1。
(5) 4 && 0 || 2 的值为1。

在C++中,整型数据可以出现在逻辑表达式中,在进行逻辑运算时,根据整型数据的值是0或非0,把它作为逻辑量假或真,然后参加逻辑运算。

通过这几个例子可以看出: 逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”对待)。如果在一个表达式中的不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。

实际上,逻辑运算符两侧的表达式不但可以是关系表达式或整数(0和非0),也可以是任何类型的数据,如字符型?浮点型或指针型等。系统最终以0和非0来判定它们属于“真”或“假”。例如'c ' &&  'd'的值为1。

熟练掌握C++的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。例如,要判别某一年(year)是否为闰年。闰年的条件是符合下面两者之一: ①能被4整除,但不能被100整除。②能被100整除,又能被400整除。例如2004? 2000年是闰年,2005? 2100年不是闰年。

可以用一个逻辑表达式来表示:

(year % 4 == 0 && year % 100 != 0) || year % 400 == 0

当给定year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。可以加一个“!”用来判别非闰年:

!((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

若表达式值为真(1),year为非闰年。也可以用下面的逻辑表达式判别非闰年:

(year % 4 != 0) || (year % 100 == 0 && year % 400 !=0)

若表达式值为真,year为非闰年。请注意表达式中右面的括号内的不同运算符(%,!,&&,==)的运算优先次序。

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • For循环中分号隔开的3部分的执行顺序探讨

    引发这个问题思考的是一段js程序的运行结果: 复制代码 代码如下: var i = 0; function a(){ for(i=0;i<20;i++){ } } function b(){ for(i=0;i<3;i++){ a(); } return i; } var Result = b(); 这段程序的运行结果是Re...2014-05-31
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • 浅谈Docker-compose中的depends_on顺序的问题解决

    本文主要介绍了浅谈Docker-compose中的depends_on顺序的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-03
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • c#的异或运算符介绍

    这篇文章介绍了c#的异或运算符,有需要的朋友可以参考一下...2020-06-25
  • 轻松学习C#的运算符

    轻松学习C#的运算符,对C#的运算符感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的运算符。...2020-06-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C#中38个常用运算符的优先级的划分和理解

    这只我自己在学C#中的一些总结,其中对于各级的划分方式、各操作符的优先级的理解并不见得正确,只是自己的看法,拿出来与大家分享...2020-06-25