第三天
来源:互联网 发布:单片机的编程软件 编辑:程序博客网 时间:2024/04/29 08:27
1. 在位运算和逻辑运算中,我们要知道,当某个变量进行位运算之后,该变量本身不会被修改,只有当该变量被再次赋值之后,该变量的值才会改变。有符号数的移位补的是符号位。对于逻辑运算的短路性大家可以看看下面的实例。
#include <stdio.h>int main(){ int a = 7,b= 9,c = 0; //逻辑与&& 的短路特性 printf("a > b && c++ : %d\n",a > b &&c++); printf("c = %d\n",c); //逻辑或 || 的短路特性 printf("===========================\n"); printf("a < b || c++ : %d\n",a < b || c++); printf("c = %d\n",c); return 0;}
打印出:
由此可知,逻辑与&&的短路性是只要符号前面一个表达式结果为假则整个表达式为假,即“一假都假”,不用考虑后面的式子;逻辑或 || 的短路性是只要前面的式子为真,则整个式子都是真,即“一真都真”,不管后面的式子。
对于移位操作,我们要知道,二进制左移相当于乘以二,右移相当于除以二,那么,如果我想将寄存器reg的第15~12位置为0101,该怎么做呢?设reg原来的值为0xffff 7fff,那么置位后,将变成0xffff5fff大家看看下面的代码。
#include <stdio.h>int main(){ unsigned intreg = 0xffff7fff; //读,改,写 //将reg 第15位置1,从0开始数 reg = reg |(1 << 15); printf("reg = %#x\n",reg); //将reg 第13位清0,从0开始数 reg = reg& ~(1 << 13); printf("reg = %#x\n",reg); //先将操作几位全清0,再写入指位上的1 //将reg 第15 ~ 12 位置为0101, reg = reg& ~(15 << 12) | (5 << 12); printf("reg = %#x\n",reg); return 0;}
打印出:
实际上,在ARM的单板操作中,经常用到移位操作,由此得出,在批量控制位时,我们可以先将控制位清零,再写控制位,在清零的时候,用移位操作。注意:移位操作只能用在整数之间。
现在,我们想一下,如果我们想不引入第三个变量,实现两个数据的交换,有几种做法?这里给出三种做法:
# include <stdio.h>int main(){ int a,b; printf("请输入a和b的值:"); scanf("%d%d",&a,&b); printf("a =%d, b = %d\n",a,b); // a += b; // b -= b; // a -= b; a =a+b-(b=a); // a ^= b; // b ^= b; // a ^= b; printf("a =%d, b = %d\n",a,b); return 0;}
打印的结果为:
程序比较简单,大家自行分析。
2. 大家先看看这个代码:
# include <stdio.h>int main(){ int c =0; int d = 0; d =getchar();// c = getchar(); printf(“d= %c : %d\n”,d,d); printf(“c= %c : %d\n”,d,d); return 0;}
大家都知道,这个代码打印的是:
那如果我把注释的那行c= getchar();启用呢?结果又是什么呢?实际上,它打印出:
只允许我们输入一个字符,回车后,就直接打印了。大家会发现,c在回车之后直接给出了10,这个10是怎么来的呢?细心的朋友也许会发现,10正好是“\n”的ASCII码,我们可以直接在命令行中输入:man ascii即可调出ASCII码表:
可以看到“\n“的ASCII码正好是10,程序中,直接将回车键当做成了一个字符,所以c实际上赋值的是”\n“,我们要知道,在windows下是区分ASCII码文件和二进制文件的,对回车键的处理不一样,ASCII文件输入回车时,将其转化为\r和\n两个字符,输出时,又转化回来,二进制文件不做转化。而在linux下则不区分什么ASCII码文件和二进制文件,直接当作”\n“处理。
3. 对于下面这个实例,我想得出的结果,大家会大吃一惊:
# include <head.h>int main(int argc, const char *argv[]){ printf("Hello World!\n"); printf("Welcome To Linux!\t"); //printf("Welcome To Linux!\n"); sleep(3); printf("Test!!!\t"); return 0;}
打印的结果是:
先打印出Hello World!然后等待3秒钟之后打印剩下的语句,为什么会这样呢?我们发现,这些输出语句的唯一区别是后面的格式符不一样,到底“\n“和”\t”有什么区别?其实,”\n”的作用之一刷新缓存,即将键盘中的缓存输出,所以有打印输出,而”\t“和其他格式符则没有。但是,还有一点要注意,在程序执行结束也会刷新缓存,所以就有了上面的那种现象!大家可以把中间的printf(“Welcome To Linux!\t”);换成”\n”就会发现直接打印前两句,等3秒之后,打印最后一句!
4. 最后给一个比较纠结的例子,大家先看看打印结果是什么?为什么会是这个?思考一下程序的执行过程。
#include <stdio.h>int main(){ unsignedint a = 10; int b = -30; if(a < b) { printf("a < b\n"); } else { printf("a > b\n"); } /*if(sizeof(char)- sizeof(int) > 0)*/ if(sizeof(char) > sizeof(int)) { printf("sizeof(char) > sizeof(int)\n"); } else { printf("sizeof(char) <= sizeof(int)\n"); } return 0; }
打印:
具体的讲解,下次再来给大家解释!
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- 第三天
- asp.net实现下载
- 2013完美未来之星复赛第二场题目——发放激活码
- 支持向量机通俗导论
- 华为笔试题2
- 你必须知道的 34 个简单实用的 Ubuntu 快捷键
- 第三天
- 1016
- 在Tomcat7中发布Eclipse Java EE 项目
- ssh mysql命令大全
- Ubuntu 18签名错误: W: GPG error: http://ppa.launchpad.net lucid Release:
- 我的c++笔记[0]
- this关键字
- 2013完美未来之星复赛第一场题目——文字处理屏蔽字库
- 值得关注的议题,欢迎围观