程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 第三天

第三天

編輯:關於C語言

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;

  }

打印:

下次再給解釋!


本文出自 “嵌入式學習之路” 博客,請務必保留此出處http://fancong.blog.51cto.com/3191877/1290982

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved