当前位置: 首页 > news >正文

【运算符】C语言的运算符_liangchaoxi的IT博客_新浪博客

运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 (有0则为0)| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1      (有1则为1)^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1  (P10OUT^=BIT3; //P10.3引脚电平翻转 ) (不同为1)  ~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

http://liuye066.iteye.com/blog/707114

注意:自己今天写程序时候把关系运算符号和位逻辑的优先级弄反。尽量用括号,就不出问题。
如:if(P1OUT&BIT0==0)P1OUT ^=BIT0; //判断p1.0是否输出为0,是就翻转,即点亮LED.
这行程序是错误的。可两边加上括号,即if((P1OUT&BIT0)==0),或是直接用:P1OUT|=BIT0;

具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相
关,而->及.是取结构成员。
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高
的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。接下来是算术运算符,*、/、%的优先级当然比+、-高了。
移位运算符紧随其后。
其次的关系运算符中,< <= > >=要比 == !=高一个级别,不大好理解。
所有的逻辑操作符都具有不同的优先级(单目运算符出外,!和~)
逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。
跟在其后的&&比||高。
接下来的是条件运算符,赋值运算符及逗号运算符。在C语言中,只有4个运算符规定了运算方向,它们是&&、| |、条件运算符及赋值运算符。&&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式
的值。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断
在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。
赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。

好了,下面来看看一个例子:

int k=15,t;
t=k&&k==5&&++k;运行后得到的 k为什么是 15不是16 ??

====

要理解这个问题分三步:
1.重点记住
=的优先级比&&,==,++都要低,且它的结合性为右结合性
&&的优先级低于==,++,且它的结合性为左结合性
==的优先级低于++,且它的结合性为 左 结合性
++的优先级这这个表达式中最高,且它的结合性为 右 结合性

2.时刻想到
逻辑运算符&&和||会出现短路现象:
* && * :当&&的左边为假时短路,此时不再执行&&右边的表达式(注意是&&右边的另一个表达式,而不是右边所有到到语句结束的表达式!!)
* || * :当||的左边为真时短路,些时不再执行||右边的表达式

3.详细推导
在表达式t=k&&k==5&&++k中,根据运算符的优先级和结合性来确定,表达式相当于:
t= ( k && (k==5) && (++k) )
根据&&的结合性,表达中肯定先验证第一个&&的两边为:k && (k==5)
由于k为15,左边为真,并没有短路,所以继续看&&的右边,表达k==5明显为假,值为0,所以表达式k && (k==5)为假,值为0,此时表达简化为:
t= ( 0 && (++k) )
此时表达式中的&&为原表达式中的第二个&&,再看这个表达式的0 && (++k),很明显&&的左边为0,发生短路,那么不再执行&&的(++k),所以k保持原值不会为16,此时原表达式又进一步简化为:
t=0
最后,t的值为0,k的值不变为15

这样解释,你明白吗?
========

计算机不是人,它不会像人一样直接就找到优先级最高的*号进行运算

理解程序编译过程相当重要

附录:C语言运算符及优先级
优先级         运算符         含义                   运算符类型        结合方向
15         ()         圆括号                             单目            自左向右
         []         下标运算符                
         —>         指向结构体成员运算符                
         、         结构体成员运算符               
14         !         逻辑非运算符                                        

相关文章:

  • 【运算符】C语言的运算符
  • 头文件中应该放些什么2
  • 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...
  • 【IAR警告】Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined......
  • char   a[100]={0};初始化的含义是什么呢?_liangchaoxi的IT博客_新浪博客
  • char   a[100]={0};初始化的含义是什么呢?
  • 【乱码】输出乱码,乱码“烫烫烫……”分析_liangchaoxi的IT博客_新浪博客
  • 【乱码】输出乱码,乱码“烫烫烫……”分析
  • 字符串数组及其初始化问题_liangchaoxi的IT博客_新浪博客
  • 字符串数组及其初始化问题
  • 【链表操作】链表的建立、删除、修改、插入_liangchaoxi的IT博客_新浪博客
  • 【链表操作】链表的建立、删除、修改、插入
  • 【单片机经验】点滴积累_liangchaoxi的IT博客_新浪博客
  • 【单片机经验】点滴积累
  • 再会 volatile 关键字——the order of volatile accesses is undefined_liangchaoxi的IT博客_新浪博客......
  • [译] 怎样写一个基础的编译器
  • C++入门教程(10):for 语句
  • es6(二):字符串的扩展
  • iOS 颜色设置看我就够了
  • Java-详解HashMap
  • leetcode98. Validate Binary Search Tree
  • miaov-React 最佳入门
  • passportjs 源码分析
  • rc-form之最单纯情况
  • ReactNativeweexDeviceOne对比
  • Spring声明式事务管理之一:五大属性分析
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 强力优化Rancher k8s中国区的使用体验
  • 微服务核心架构梳理
  • 学习Vue.js的五个小例子
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (23)Linux的软硬连接
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (一)RocketMQ初步认识
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net反混淆脱壳工具de4dot的使用
  • .NET构架之我见
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .sh
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • :=
  • [ 数据结构 - C++]红黑树RBTree
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [bzoj2957]楼房重建
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!