1. 程式人生 > >C語言語法目錄二

C語言語法目錄二

常量 efault spa gist getchar() 語言 sig 需要 -s

1、char類型 

  char c;定義了一個char變量
  ‘a‘ ; char常量
  char的本質就是一個整數,一個只有一個字節大小的整數
  char c; 定義一個有符號的char
  unsigned char b; 定義一個無符號的char
  c = 4; //c等於一個整數 -->4
  c = ‘4‘;//c等於一個字符4,對應ASCII碼的52
  %c 表示是輸出一個字符,而不是一個整數
 大寫字母轉小寫的方法:
  例如: char a = ‘B‘;
  a = a + 32;
  printf("%c \n",a);
 例二:
  char a = 127;


  a = a+5;
  printf("%d",a); // -124

  分析:a=127 --> 0111 1111 -->+5-->1000 0100(最高位為1,計算機便認為它是負數,則當做了補碼,則轉成原碼輸出)
  補碼-->原碼 1000 0100 --> 1111 1011 + 1-->1111 1100(最高位表示符號),則輸出的二進制是0111 1100,十進制為-124。
  char 和 unsigned char
  char的取值範圍 -128到127。
  unsigned char 為0-255

2、不可打印char轉義符

  \a 警報 char a = ‘\a‘ ; printf("%c",a); 不顯示,只有一聲警報


  \b 退格
  \n 換行(回車+換行)
  \r 回車(回到頭部)
  \t 制表符
  \’ 輸出單引號
  \? 輸出問號
  \\ 輸出 \

3、浮點數float(4bytes)、double(8bytes)、long double類型-->效率低

  其字節數隨系統而變化,常用32架構系統如上的所示。
  小數四舍五入的方法:
  float a = 3.6;
  a = a + 0.5;
  printf("%d",a);# 只保留整數部分

4、volatile

  代表變量是一個可能被CPU指令之外的地方改變的,編譯器就不會針對這個變量去優化目標代碼。例如:volatile int i


  register 變量在CPU寄存器裏面,而不是內存裏面。但regist是建議型的指令,而不是命令型的指令。例如:register int a

5、字符串格式化輸出和輸入  

  1、字符串在計算機內部的存儲方式
    字符串是內存中一段連續的char空間,以‘\0‘結尾。
  2、"" 是c語言表示字符串的格式。printf("%s",‘hello world‘ );
  3、printf函數、putchar函數
    輸出%,-->printf("%%");
    ‘l‘附加在d,u,x,o前面,表示長整數。
    ‘-‘左對齊-->printf("%-5d");去掉‘-‘默認右對齊。
    ‘0‘位寬不夠0來湊,但不能與‘-‘混用。
  4、putchar函數是顯示一個字符的函數。
    putchar(97) -->輸出‘a’

  5、scanf函數
    scanf("%d",&a) //用&取變量的地址。

   常用字符串輸入輸出函數如下:   

技術分享圖片
#include<stdio.h> 
#include<stdlib.h>

// scanf 輸入 
int main1(void)
{
    char a[100] = {0};  // 輸入:hello world 
    scanf("%s",a); //%s 表示輸入一個字符串 ,scanf是以回車作為輸入完成標識的,但回車鍵本身並不會作為字符串的一部分 
    // 如果scanf參數中的數組長度小於用戶在鍵盤輸入的長度,那麽scanf就會緩沖區溢出,導致程序崩潰 
    int i = 0;
    for(i=0;i<10;i++) 
    {
        printf("%d\n",a[i]);
    }
    printf("---------\n"); //輸出:hello  -->scanf將回車和空格都視為字符串結束標誌 
    printf("%s",a);
    return 0;
}

// gets() 輸入 ,不能用類似“%s”或者 "%d"之類的字符轉義,只能接受字符串的輸入。 
int main2(void)
{
    
    char s[100] = {0};
    gets(s); // 輸入:hello world ,gets()函數同樣是獲取用戶輸入,它將獲取的字符串放入s中,僅把回車鍵視為結束標誌 ,但也有溢出問題 
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d\n",s[i]);
    }
    printf("-------\n");
    printf("%d\n",s); // 輸出:hello world 
    return 0 ;
}

// gets()獲取用戶輸入,atoi() 函數將字符串轉為數字 
int main3(void)
{
    char a[100] = {0};
    char b[100] = {0};
    gets(a); // 獲取第一次輸入,a的對象只能是數組 ,不能轉義(字符串轉為數字),需要 使用專門的函數 
    gets(b);
    int i1 = atoi(a); // 將字符串轉化為一個整數 
    int i2 = atoi(b);
    printf("%d\n",i1+i2);
    
    return 0;
}

// fgets()函數用法
int main4(void) 
{
    char c[10] = {0};
    fgets(c,sizeof(c),stdin);//第一個參數是char的數組,第二個參數是數組的大小,單位字節,第三個參數代表標準輸入。
    // 輸入: hello world 
    printf("%s\n",c);// 輸出:hello wor --> 它把字符串尾的 0 也包括在內了,fgets()會自動截斷,防止溢出,所以很安全
    // 調用fgets()的時候,只要能保證第二個參數小於數組的實際大小,就可以避免緩沖區溢出的問題。 
    return 0;
}

// puts() 函數自動會在輸出完成後打印一個‘\n‘出來
int main5(void) 
{
    char d[100] = {0};
    gets(d);
    printf("------\n");
    puts(d);  //自動輸出,附帶換行 
    return 0 ;
}

// fputs()函數,是puts的文件操作版
int main(void) 
{
    char e[100] = {0};
    fgets(e,sizeof(e),stdin); // hello world mylove
    printf("----------\n");
    fputs(e,stdout);  // hello world mylove
    return 0;
}
View Code

  6、getchar函數
    char a ,b;
    a = getchar();//得到用戶鍵盤的按鍵對應的ASCII碼值
    getchar() //獲取回車
    b = getchar();//得到用戶鍵盤的按鍵對應的ASCII碼值
    printf("a+b=%d",(a-‘0‘)+(b-‘0‘)); //得到對應的值
  7、左值:表示可以被更改的數據對象。
    右值:能賦給左值的量。

6、運算符

  + - * / % += -= *= /= %=
  a+=1 <-> a++ //自加1 ++(後綴)從左到右;++(前綴)從右到左
  a-=1 <-> a-- //自減1
  例如:
    int a,i;
    i = 3;
    a = ++i; //a=4
    //a = i++; // a=3
  總結:i++先計算表達式的值;++i先自身++,再計算表達式的值。
  例如:
    int i = 6;
    int a = i++ + ++i;
    printf("%d\t%d",a,i); // 14 8
  分析:實際分以下三步
    i = i+1;
    int a = i+i;
    i = i+1;

7、逗號表達式

  int a,b,c;
  a = 1;
  b = 2;
  c = (a=b,a+b) //先算括號內逗號左邊的,再算逗號後邊的,表達式取逗號右邊的值
  printf("%d",c) //4

8、空語句,只有一個 ; 號表示

  強制類型轉換
  double f = 3/2; //c語言兩個整數相除的結果自動轉化為一個整數
  double d = (double)3/2; //(double)3將整數3強制轉化為double型
  printf("%f\t%f",f,d); // 1.000000 1.500000

9、關系運算(從左到右)

  > < >= <= 為一類,優先級相同
  == != 為一類,優先級相同,上一類的優先級高於這一類。

10、邏輯運算符(從左到右) 

  與(&&) 一假則假
  或(||) 一真則真
  非(!) 真變假,假變真

11、int main() 在c裏面,代表這個函數可以有參數,也可以沒有參數

  int main(void) 明確表示沒有參數

12、if..else(if、if...else 、 if...else if...else if...else..)

13、switch 多重選擇 

  int main()
  {
    int i = 1;
    switch(i)
    {
    case 0:
      printf("i = 0\n")
      break
    case 1:
      printf("i = 1\n")
      break
    case 2:
      printf("i = 2\n")
      break
    case 3:
      printf("i = 3\n")
      break
    default: # 以上情況都不滿足時執行
      printf("error\n")
    }
  }
  說明:不加break時,上述程序會執行case1、case2、case3,輸出i=1,i=2,i=3
  加break後,只會執行case1,輸出i=1(加reak才是正確用法)

14、if 和 switch 的比較: 

  當條件很復雜,分支中包含&&、||、!等時,用if語句
  當條件很簡單,但分支很多,適合用switch語句。

15、條件運算符 ?  

  int c = (a>b) ? a:b
  先求?左邊的表達式值,如果表達式成立,冒號左邊的值為整個表達式的值,反之為冒號右邊的值

16、goto語句與標號  

  無條件跳轉goto,不建議使用,使代碼可讀性變差。

17、while  

  while(條件) 條件為真時執行循環,條件為假,退出循環。
  while(1) //死循環
  {
  printf(‘hello‘);
  }

18、continue 和 break 

  continue會導致循環語句直接回到循環的開始(終止當前循環,繼續下一次循環)。
  break 終止當前循環,退出循環。

19、do...while循環  

  do{

  復合語句;

  }while(條件); //分號一定不能少
  do...while和while的區別:do...while中的復合語句至少執行一次,而while語句中復合語句可能一次都不執行。

20、for循環 

  for(i = 0;i<10;i++)
  {
    語句;
  }
  //i=0只執行一次,就是第一次for循環,此時不執行i++.
  for(;;) // 死循環 for(;1;) 死循環 for(;0;) 不執行
  {
    printf(‘hello‘);
  }

  實例:打印三角形 

    #include<stdio.h>
    int main(void)
    {
        int i,j;
    
    for(i=1;i<7;i++) //行數 
    {
        for(j=1;j<7-i;j++) //空格 
        {
            printf(" ");
        }
        for(j=0;j<(2*i-1);j++) // * 
        {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
    }

   擴展:打印倒三角形,打印鉆石

C語言語法目錄二