第三天

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;
 }

打印:

具体的讲解,下次再来给大家解释!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值