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

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为非闰年。请注意表达式中右面的括号内的不同运算符(%,!,&&,==)的运算优先次序。

(0)

相关推荐

  • 深入解析C++编程中__alignof 与__uuidof运算符的使用

    __alignof 运算符 C++11 引入 alignof 运算符,该运算符返回指定类型的对齐方式(以字节为单位).为实现最大的可移植性,应使用 alignof 运算符,而不是特定于 Microsoft 的 __alignof 运算符. 返回一个 size_t 类型的值,该值是类型的对齐要求. 语法 __alignof( type ) 备注 例如: Expression 值 __alignof( char ) 1 __alignof( short ) 2 __alignof( int ) 4

  • 详解C++中的成员访问运算符和指针到成员运算符

    成员访问运算符:. 和 -> 语法 postfix-expression       . name postfix-expression –> name 备注 成员访问运算符 . 和 -> 用来引用结构.联合和类的成员.成员访问表达式具有选定成员的值和类型. 有两种形式的成员访问表达式: 在第一种形式中,postfix-expression 表示结构.类或联合类型的值,name 为指定的结构.联合或类的成员命名.运算的值是 name 的值且为左值(如果 postfix-expressio

  • C++编程中new运算符的使用学习教程

    new运算符用作从自由存储为 type-name 的对象或对象数组分配内存,并将已适当分类的非零指针返回到对象. [::] new [placement] new-type-name [new-initializer] [::] new [placement] ( type-name ) [new-initializer] 备注 如果不成功,则 new 将返回零或引发异常:有关详细信息,请参阅 new 和 delete 运算符. 通过编写自定义异常处理例程并调用 _set_new_handler

  • C++中的按位与&、按位与或|、按位异或^运算符详解

    按位与运算符:& 语法 expression & expression 备注 表达式可以是其他"与"表达式,或(遵循下面所述的类型限制)相等表达式.关系表达式.加法表达式.乘法表达式.指向成员的指针表达式.强制转换表达式.一元表达式.后缀表达式或主表达式. 按位"与"运算符 (&) 会将第一操作数的每一位与第二操作数的相应位进行比较.如果两个位均为 1,则对应的结果位将设置为 1.否则,将对应的结果位设置为 0. 按位"与"

  • 详解C++中的增量运算符++和减量运算符--的用法

    前缀增量和减量运算符:++ 和 --   语法 ++ unary-expression –– unary-expression 备注 前缀递增运算符 (++) 向其操作数添加 1:此递增值是表达式的结果.操作数必须是类型不为 const 的左值.结果是与操作数相同类型的左值. 前缀递减运算符 (––) 与前缀递增运算符类似,只不过操作数将减少 1,并且结果是递减值. 前缀和后缀递增和递减运算符均会影响其操作数.它们之间的主要差异是递增或递减在表达式的计算中出现的顺序.在前缀形式中,将在表达式计算

  • C++编程中的或||、与&&、非!逻辑运算符基本用法整理

    逻辑或运算符:||   语法 logical-or-expression || logical-and-expression 备注 如果任一操作数或两个操作数为 true,则逻辑"或"运算符 (||) 返回布尔值 true:否则返回 false.操作数在计算之前隐式转换为类型 bool,结果的类型为 bool.逻辑"或"具有从左向右的关联性. 逻辑"或"运算符的操作数不需要是同一类型,但是它们必须是整型或指针类型.操作数通常为关系或相等表达式.

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

    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>>

  • Jquery ajax执行顺序 返回自定义错误信息(实例讲解)

    1.多个Ajax 在一个function中的执行顺序 由于Jquery中的Ajax的async默认是true(异步请求),如果想一个Ajax执行完后再执行另一个Ajax, 需要把async=false就可以了. 复制代码 代码如下: function TestAjax(){            var UserName = $("#txtUserName").val();            $.ajax(            {                url: &quo

  • ruby 程序的执行顺序

    1. 先搜索BEGIN语句,搜到则执行,否则执行程序的第一行 2. 碰到函数定义,类定义,模块定义则执行,导致这些东西被定义 3. 碰到导致程序退出的语句,或者到了文件结尾或者遇到__END__则退出执行 4. 在退出执行前,典型的执行END语句块或者由at_exit注册的退出钩子语句.但是如果由exit!导致的退出,前面的两种情况不执行

  • 浅谈Java文件执行顺序、main程序入口的理解

    在我们通过JVM编译Java后缀名的文件时,JVM首先寻找入口(main方法) public static void main(String[] args) 1.由于在入口时,未调用任何对象,该方法只能设置为static静态 2.JVM为Java的最底层,所以即使有返回结果,结果也无处可去,因此该方法必然是void无返回值 3.由于main方法是入口,被JVM自动调用,只有将该方法设置为public公有级别才能对JVM可见 综上,入口main方法只能写为 public static void m

  • 关于C#执行顺序带来的一些潜在问题

    前言 编写程序的时候,人们的直观感觉通常认为,程序的执行顺序是按照语句的顺序进行的.然而,许多编程语言的规范是允许实际执行顺序与语句编写顺序不符的.实际上,编译器为了完成某种优化,常常会对一些操作进行适当的顺序调整,导致一些预料之外的现象. 实验现象 首先,通过一个例子来展示这个现象.在一个C# .NET Core 3.1命令行程序中,定义两个全局变量a和b,在线程1中,依次对b和a进行递增.这样,在任何时刻b应当等于a或a+1. static int a = 0; static int b =

  • 浅谈Python3多线程之间的执行顺序问题

    一个多线程的题:定义三个线程ID分别为ABC,每个线程打印10遍自己的线程ID,按ABCABC--的顺序进行打印输出. 我的解法: from threading import Thread, Lock # 由_acquire解锁执行后释放_release锁 def _print(_id: str, _acquire: Lock, _release: Lock) -> None: for i in range(10): _acquire.acquire() print(f"id:{_id}&

  • 改变 Python 中线程执行顺序的方法

    一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctime def sing(): for i in range(3): print("正在唱歌...%d" % i) sleep(1) def dance(): for i in range(3): print("正在跳舞...%d" % i) sleep(1) if __name__ == '

  • C++中多线程的执行顺序如你预期吗

    目录 一个简单的例子 诡异的输出结果 你看到的执行顺序不是真的执行顺序 你看到的执行顺序还不是真正的执行顺序 C++多线程内存模型 一个简单的例子 先来看一个多线程的例子: 如图所示,我们将变量x和y初始化为0,然后在线程1中执行: x = 1, m = y; 同时在线程2中执行: y = 1, n = x; 当两个线程都执行结束以后,m和n的值分别是多少呢? 对于已经工作了n年.写过无数次并发程序的的我们来说,这还不是小case吗?让我们来分析一下,大概有三种情况: 如果程序先执行了x = 1

  • C++ 程序抛出异常后执行顺序说明

    1 析构函数中是否可以抛出异常 首先我们看一个常见的问题,析构函数中是否可以抛出异常.答案是C++标准指明析构函数不能.也不应该抛出异常! C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的. C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持. 那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是

  • JavaScript执行顺序详细介绍

    之前从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当然JavaScript代码的执行顺序是比较复杂的,所以在深入JavaScript语言之前也有必要对其进行剖析.1.1  按HTML文档流顺序执行JavaScript代码首先,读者应该清楚,H

随机推荐