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;
}
打印:
下次再给解释!