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;

}

打印出:

第三天_嵌入式_02

实际上,在ARM的单板操作中,经常用到移位操作,由此得出,在批量控制位时,我们可以先将控制位清零,再写控制位,在清零的时候,用移位操作。注意:移位操作只能用在整数之间。

现在,我们想一下,如果我们想不引入第三个变量,实现两个数据的交换,有几种做法?这里给出三种做法:

# include <stdio.h>


int main()

{

   int a,b;

   printf("请输入ab的值:");

   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;

}

打印的结果为:

第三天_Linux_03

程序比较简单,大家自行分析。


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;

}

大家都知道,这个代码打印的是:

第三天_嵌入式_04

那如果我把注释的那行c= getchar();启用呢?结果又是什么呢?实际上,它打印出:

第三天_C语言_05

只允许我们输入一个字符,回车后,就直接打印了。大家会发现,c在回车之后直接给出了10,这个10是怎么来的呢?细心的朋友也许会发现,10正好是“\n”的ASCII码,我们可以直接在命令行中输入:man ascii即可调出ASCII码表:

第三天_C语言_06

可以看到“\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;

}

打印的结果是:

第三天_Linux_07

先打印出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;

  }

打印:

第三天_Linux_08

下次再给解释!