C符号之逻辑运算符 左移与右移 自增自减
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
本篇文章将总结C中一些比较有趣的符号
逻辑运算符:“ || ” 与 “ && ” 是比较常用的逻辑运算符,分别是 或 和 与。
或(||):双目运算符。两者中任一为真即为真。
与( &&):双目运算符。两者都为真时才为真,任一为假即为假。
但是,这两个运算符都有一个有趣的地方。请看下面的例子:
int a=0, b=1;if( b++ || ++a ){ printf("%d", a);}
编译通过。运行结果是 0 。
这就奇怪了。 ” || “ 不是判断两个数是否为真吗?没错,确实是判断了,但是这里只是判断了前面的一个,因为检查到前者为真了,所以后者就不检查了,不检查也即不执行了。因为 ” ||“只需两者任一为真就为真。所以直接执行判断前者,如果为假才再去执行后者进行判断。哈哈,是不是很聪明呢?(其实是太懒了)
同样,对于 ” && “ 也是这样。也可以试试运行下面这例子。
int a=0, b=1;if( ! ( a && ++b) ){ printf("%d", b);}
左移(<<)与右移(>>):
两者都为双目运算符。两者在移位时都遵循各自的特点。
“<<”:移动时,高位丢弃,地位补0。
“>>”:移动时,对于有符号数,其符号位将随同移动。当为整数时,最高位补0;而为负数时,符号位为 1,最高位是补 0 或是补 1 取决于编译系统的规定。
在这个运算符的学习过程中,我结合了前面的大端、小端模式。这是计算机存储数据的模式。通过测试后,本人的计算机为小端模式。并结合小端模式和左移、右移运算符的知识。发觉数据存储模式并不会影响左移、右移运算符的操作。这就衍生了一个新的问题,大端、小端模式对什么有影响?在什么情况下有影响?
下面来看看一个例子:
0x01<<2+3
不要惊讶,结果是32,因为优先级的问题,+ 比 << 优先级要高
那这两个呢?
0x01<<2+30;0x01<<2-3;
编译运行,是不行的,因为
- 左移和右移的位数是不能超出数据的长度
- 也不能小于0
自增(++)与自减(— —):
a ++:先用再加
++ a:先加再用
自减运算符同样。
这两点太基础了,也太普通了。下面我们来看点有意思点的。
int a=1, b=1;printf("%d", a+++b); //语句 1
语句 1 是什么意思?呵呵,这里就要说说 贪心法 了。
C语言有这样一个规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符时,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理的策略被称为 “贪心法”。
现在我们知道C语言有这样的规则,对 语句 1 的意思也有明白了。没错,a+++b 等于a++ + b。
如果是换成这样子呢?a+++++b?又会怎样?
编译不通过。我们换种写法,改为a+++ ++b。这个时候编译通过了!这里我们再次根据”贪心法“去思考这个问题。就恍然大悟了!
这里也总结了一件事,理论还是理论。即使你明白,理解。但是没有经过实践的话,是不会掌握的!就如 a+++++b 一样,你不去实践,按照理论去想的话。肯定能编译通过的,但是你实践了,才知道是错误的。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
C符号之逻辑运算符 左移与右移 自增自减相关推荐
- 有符号数的左移和右移
对于无符号数的左移和右移,因为不涉及到符号位的问题,比较好理解: 左移低位补零,高位舍弃 右移高位补零,低位舍弃 对于有符号数的左移和右移,因为符号位的参与,可能各个编译器的实现方式上有差别 我在/h ...
- 分析轮子(二)- ,, (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
- 2018-1-20:左移和右移运算以及和(无符号右移)的区别以及位运算的小题目...
首先:左移和右移以及无符号右移都是应用于2的次幂运算 左移几位就相当于该数据乘以2的几次方:即完成2的次幂运算 右移几位就相当于该数据除以2的几次方:即完成2的次幂运算,右移有个小特点:右移之后空出的 ...
- Java负整数的左移、右移、无符号右移
Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆. Java的<< >> ...
- 【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充
文章目录 1 位操作 1.1 按位与 1.2 按位或 1.3 按位异或 1.4 取反 1.5 左移 1.6 右移 2 单片机中常用操作 2.1 不改变其他位时,对某几个位设定值 2.2 移位操作提高代 ...
- 关于程序中的操作符左移和右移问题
程序中经常会看到<< 5或者>>等符号,这表示左移和右移操作.比如你一串数字是123456789, 那么你左移5位(<< 5)就会得到678900000,如果你右移 ...
- Java基础——左移和右移
首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的. 左移位:<<,有符号的移位操作 左移操作 ...
- c++中的左移、右移运算
移位运算包含"逻辑移位"(logical shift)和"算术移位"(arithmetic shift). 逻辑移位:移出去的位丢弃,空缺位(vacant bi ...
- 位运算中的左移和右移的计算详解
最近在学习javaScrapt,在学到位运算符这部分的时候,突然发现看不懂书上的例子了.经过查找资料后,发现了一遍不错的文章.分享一下: 正数的左移和右移 以3为例 3的二进制为 00000011 右 ...
最新文章
- 初识Redis,看这一篇就够了
- Python OpenCV学习笔记之:图像读取,显示及保存
- php函数间参数传递(值传递/引用传递)
- ug10许可证错误一8_落实管理要求 做好证后监管——江西省南昌市开展排污许可证后监管探索与实践...
- Python实训day04pm【网络爬虫(文本、图片)】
- Vue项目中的初始化
- 第1章 Python 数字图像处理(DIP) --绪论
- php debug用什么意思,phpdebug_backtrace()函数是干什么的?
- win10共享打印错误0x0000006_Win10连接共享打印机提示0x80070035错误的解决办法
- 【Python】文件的使用
- 2011年中期业绩预增前20家公司
- 华为交换机开启ftp服务,上传和下载文件,get和put操作实例
- 国产奶粉争上游,“河北奶王”君乐宝出了一半力
- 掘金小册大众评审团流程
- oracle周数计算方法
- PERL XS tutorial
- 什么是敏捷项目管理 (Agile Project Management)?
- Maven——maven工程找不到maven库
- 数据仓库ETL工具箱——清洗和规范化(一)
- 蒙文蒙古语翻译软件,实线蒙文翻译页面滚动回到蒙古语翻译顶部
热门文章
- sql 2008 使用output避免数据修改后的二次查询
- Spring AOP学习笔记
- apache phoenix 入门_实现Phoenix入门
- 为什么SimpleDateFormat不是线程安全的?
- 基于Docker的Redis集群简单搭建
- macos 致命错误: 在类路径或引导类路径中找不到程序包 java.lang
- Android 人脸照片对比,人脸对比
- elasticdump elasticsearch数据备份与迁移 导入导出
- IIS 指定了身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持一种身份验证的规范。...
- 在线安装php,CentOS在线安装PHP|dayblog-天天博客|PHP交流,PHP技术,PHP博客,博客交流,dayblog,blog,天天博客...