C 语言提供了以下三种逻辑运算符。

  1. 一元:!(逻辑非)。
  2. 二元:&&(逻辑与)、||(逻辑或)。

以上三种逻辑运算符中,逻辑非 ! 的优先级最高,逻辑与 && 次之,逻辑或  ||  优先级最低。即算术、逻辑、赋值运算符的优先级顺序为:

逻辑非 ! >算术 > 逻辑与 &&、逻辑或 || > 赋值=

逻辑表达式的值为逻辑值,即布尔型(bool),该类型为 C99 新增的,一些编译器可能还不支持该类型。

逻辑值分为逻辑真值和逻辑假值。一般情况下,在判断时,仅有零值被判断为逻辑假值(false),一切非零值均可被判断为逻辑真值(true);在存储和表示时,通常,使用 1 表示逻辑真值,0表示逻辑假值。

逻辑与 && 运算符的运算规则:只有两个操作数均为逻辑真时,结果才为真。其余情况,结果均为假。

逻辑或 || 运算符的运算规则:只有两个操作数均为逻辑假时,结果才为假。其余情况,结果均为真。

例如,设有定义语句

  1. int a=3,b=5;

则有:

  • !a:由于 a 非零,为真,!a 为假,其值为 0。
  • a||b:由于 a 和 b 均非零,均为真,故逻辑或的结果为真,其值为 1。
  • a&&b:由于 a 和 b 均非零,均为真,故逻辑与的结果为真,其值为 1。
  • !a||b&&2:由于逻辑非 ! 优先级最高,首先与 a 结合,而 && 优先级高于 ||,相当于(!a)||(b&&2), 即 0||1 为真,其值为 1。

逻辑与 &&、逻辑或 || 均有“短路”特性:

  • 逻辑与&&“短路”:当逻辑与&&的左操作数为逻辑假时,就足以判断该逻辑运算的结果为假了,故右操作数就不再被执行。
  • 逻辑或||“短路”:当逻辑或||的左操作数为逻辑真时,就足以判断该逻辑运算的结果为真了,故右操作数就不再被执行。

例如:

  1. int a=1,b=2,c;
  2. c=a||++b;
  3. printf("a=%d,b=%d,c=%d\n",a,b,c);

由于 a 为非零值,即为真,而当逻辑或 || 的左操作数为真时,就足以判断该逻辑操作的结果为真。故发生“短路”,即右操作数 ++b 不被执行。输出结果为:a=1,b=2,c=1。

分析以下程序,输出其运行结果。

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a=0,b=2,c;
  5. c=!a||++b&&a--;
  6. printf("a=%d,b=%d,c=%d\n",a,b,c);
  7. return 0;
  8. }

代码分析:
混合表达式 c=!a||++b&&a-- 中含有的运算符有逻辑非 !、逻辑或 ||、逻辑与 &&、算术前缀 ++、算术后缀 --、赋值号 = 等6个运算符。逻辑运算符、算术运算符、赋值运算符的优先级的关系为:

逻辑非! > 算术 > 逻辑与&&、逻辑或 || > 赋值 =

由于该表达式中赋值运算符优先级最低,故最后赋值。

根据优先级的高低,表达式 !a||++b&&a-- 等价于 (!a)||((++b)&&(a--)),而逻辑或 || 的左操作数 !a 为真,此时足以判断该表达式的值为真。故发生“短路”,即 || 的整个右操作数 ((++b)&&(a--)) 不再被执行。

运行结果为:
a=0,b=2,c=1

逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解的更多相关文章

  1. C语言解决约瑟夫问题详解的代码

    将开发过程中比较重要的一些内容做个收藏,下面的内容是关于C语言解决约瑟夫问题详解的内容,希望能对码农有帮助. #pragma once #include<vector> class PRO ...

  2. Linux C 语言之 Hello World 详解

    目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...

  3. [转]C语言字节对齐问题详解

    C语言字节对齐问题详解 转载:https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: typedef struct{ ch ...

  4. R语言服务器程序 Rserve详解

    R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...

  5. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...

  6. 【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

  7. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  8. C语言预处理器命令详解【转】

    本文转载自:http://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所 ...

  9. 结构体指针,C语言结构体指针详解

    结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,& ...

  10. 【转】ecshop后台语言项执行漏洞详解

    该漏洞需要能登录ecshop后台权限,简单修改下语言项目,即可在网站植入木马后门. 以下是详细分析 1.登陆到ecshop台后,选择模板管理,语言项编辑,搜索用户信息 为什么要搜索用户 该漏洞需要能登 ...

随机推荐

  1. [POI2006] SZK-Schools - 费用流

    差不多就是个二分图带权匹配?(我还是敲费用流吧) 每个点向着自己能到的学校连边,费用按题意设定 跑最小费用最大流即可 #include <bits/stdc++.h> using name ...

  2. [ZJOI2011] 最小割 - 最小割树

    最小割树裸题 建树后,以每个点为根跑DFS求出距离矩阵,然后暴力回答询问即可 #include <bits/stdc++.h> using namespace std; #define i ...

  3. C++——多态性

    多态是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为: 多态的实现:函数重载:运算符重载:虚函数 为什么需要重载运算符? 在C++没有复数运算,进行复数运算之前我们要事先写一个复数类, ...

  4. 更新了svn 后,某个文件多了几个副本如:xxx.r1 xxx.r3 xxx.mine等,正常文件名xxx

    分析:更新了svn后 原因: 是的,修改完后,还要把问号文件全部删除,再重新提交(话说,你的SVN名字和我的名字一样,wk).你每次修改之前都更新一下最好了.

  5. webpack 之搭建本地服务器

    搭建本地服务器 webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现 我们想要的让浏览器自动刷新显示我们修改后的结果 不过它是一个单 ...

  6. 解决安装完Anaconda后右键没有powershell、、、

    法一: win+R 打开资源管理 输入powershell.exe 法二: 额,,按住 shift 再右键...嘿嘿嘿

  7. JS Data 时间对象

    new Date() 返回当前的本地日期和时间

  8. jQuery-File-Upload 使用,jQuery-File-Upload上传插件

    ================================ ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一.官网地址 ...

  9. 《深入理解Java虚拟机》读书笔记五

    第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...

  10. 题解【洛谷P1967】[NOIP2013]货车运输

    题面 题解 注意到有一些限重很低的边不会被走到. 于是考虑建一棵最大生成树,在生成树上寻找答案. 设\(f[i][j]\)表示\(i\)的\(2^j\)级祖先,\(w[i][j]\)表示\(i\)到\ ...