【2015/10/24】C學習日誌_Day 9 關鍵字

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/hsgwpj/article/details/49431913
</pre><pre name="code" class="cpp">    > File Name: main.c
    > Author: khalil
    > Mail: [email protected]
    > Created Time: Sat 24 Oct 2015 8:56:56 AM CST
 ************************************************************************/


//查找: GCC加什麼參數可以優化編譯方式
//表查找
//看《程序員的自我修養》
//貝葉斯算法




#if 0
#include<stdio.h>
int main (int argc , char ** argv)
{
    //輸入任意字符串,統計\n\t空格的數量


    char str1[128] = {0};
    char *p = str1;
    int i = 0 ;
    int j = 0 ;
    char ch  = '\0';
    int n_count = 0;
    int t_count = 0;
    int s_count = 0;


    printf("請輸入字符串,按<C-d>退出:\n");
    for ( i = 0 ; i < 128 && ch != EOF ; ++i )
    {
        ch = getchar();
        str1[i] = ch;
        switch (ch)
        {
            case '\n': n_count++;
                       break;
            case '\t': t_count++;
                       break;
            case ' ' : s_count++;
                       break;
            default  : break;
        }


    }
    str1[i-1] = '\0';




    printf("\n你輸入的字符串爲:\n%s\n",p);
    printf("你輸入的\\n,\\t,空格分別爲:%d %d %d \n",n_count,t_count,s_count);
    return 0 ;


}
#endif


#if 0
//Unicode 有65535種編碼(2^16)
#define LENGTH  (256)
#define ZERO    (0)


#include<stdio.h>
int main ( int argc , char ** argv )
{
    //空間換取時間:
    //
    //      時間的寶貴程度一般是大於空間的
    //
    //      256種字符,
    //
    //      int ASCII_count[256] = {0};
    //
    //      //記錄各個字符出現的次數
    //      a   97  ASCII_count[97]++ ; // 0  --> 1
    //      A   65
    //      0   48
    //      \n  10
    int i = 0 ;
    int ASCII_count[LENGTH] = {0};
    char ch  = 0;


    printf("請輸入任意字符,<C-d>結束:\n")


    while ((ch = getchar()) != EOF)
    {
         ASCII_count[ch]++;
    }


    for ( i = 0 ; i < LENGTH ; ++i )
    {
        if( ASCII_count[i] != ZERO )
        {
            printf("\n字符 %c 出現了\t%d\t次\n",i,ASCII_count[i]);
        }
    }


    return 0;
}


#endif


#if 0
//素數的處理可以採用篩法
#endif


#if 0
/*
 *  介紹C語言中的關鍵字
 *
 *
 */
#include<stdio.h>
#include<time.h>


void func1(void);


void func1(void)
{
    auto int a = 10;    //等價於 int a = 10;
}


//register int global_value           = 0;


//static register int static_value    = 0;


void func2(register int i);


void func2(register int i)
{
    printf("i = %d\n",i);
}
int main ( int argc , char ** argv )
{
    //auto 自動變量
    //《程序員的自我修養(編譯、鏈接和庫)》
    int a = 10 ;    //由函數內部定義的變量,該變量存在於棧上,
                    //生存週期爲函數調用時定義,函數調用結束時被釋放
    func1();


    register int i = 0 ;     //計數器
//  int i = 0;              //存在寄存器中的變量會比自動變量快一個數量級
                            //
                            //儘量把變量存在寄存器中提升運行速度 但是有空間限制
                            //
                            //register 有修飾限制:
                            //
                            //1.自動變量    可以
                            //2.靜態變量    不可以
                            //3.全局變量    不可以
                            //4.函數參數    可以
                            //


    //寄存器變量不能直接取址
    int *p = &i;
    *&i = 233;
    printf("%x\n",i);
    printf("%x\n",p);




    clock_t  start = 0;     //long long int 類型
    clock_t  end   = 0;     //使用clock()進行CPU記時來比較寄存器變量和自動變量的
                            //區別


    start = clock();


    for ( i = 0 ; i < 1000000000 ; ++i )
    {
         //do something;
    }


    end = clock();


    printf ("%lf\n", (double)(end - start)/CLOCKS_PER_SEC) ;


    func2(i);
    return 0 ;
}






#endif


#if 0
#include<stdio.h>


void func1(void);
void func2(void);


void func1(void)
{
    int a = 0;
    a++;
    printf("a = %d\n",a);


}


void func2(void)
{
    static int b = 0;
    b++;
    printf("b = %d\n",b);
}


///////////////////////////////////////////////////////////////////
void func3(void);
static void func4(void);
void func3(void)
{
    ;
}
static void func4(void)
{
    ;
}


int main ( int argc ,char **argv )
{
    //static 靜態
    //
    //1.可以修飾變量:
    //      (1)靜態全局變量:
    //          static 全局變量和普通的全局變量有什麼區別?
    //          (1)二者都先於主函數創建;
    //          (2)生命週期貫穿整個程序;
    //          (3)都存在於內存的靜態區;
    //          (4)區別: 全局變量可以被外部.c文件識別使用,而靜態局部變量
    //               只能被本文件使用(而且是從它定義的位置向下開始);
    //
    //          ---疑問: 鏈接到底做了什麼? key_word:符號表;
    //
    //      (2)靜態局部變量:
    //          在函數內定義
    int i = 0;
    for ( i = 0 ; i < 10 ; ++i )
    {
         func1();
         func2();
    }




    //2.static可以修飾函數:
    //      (1)沒加static的函數:可以被其他.c文件識別
    //      (2)static函數:只能在本文件使用
    //


    return 0 ;
}
#endif


#if 0
//編程實現: int ftoi(float value);
//eg:
//  int  result = ftoi(12.5)        //result = 12 float轉換爲int類型
#include<stdio.h>
//浮點數的位存儲形式:
//
//  12.25 => 1100.01(二進制) = 1.10001 * 2^3 (二進制科學技術法)
//           2*3+ 2*2 + 2^-2
//
//      3       -> 指數位
//      10001   -> 尾數
//      0       -> 符號位
//
//規則如下:
//  12.25:
//  0 0000001 |1
//    1111111 |1
//  0 1000001 |0 10001 00 |00000000 |00000000
//  f zzzzzzz |z wwwww ---|----補零-|--------
//  f符號位 z指數位 w尾數位
//  (1)左1位符號位,正數0,負數1
//  (2)指數位佔8位 如果是正數 需要加127
//  (3)尾數位32-1-8=23位


int ftoi(float value)
{
    ;
}


int main ( int argc , char **argv )
{
    float a = 12.25;
    printf("ftoi的結果是:%d\n",ftoi(a));
    return 0 ;
}






#endif


#if 0
#include<stdio.h>
#include<string.h>
int main (int argc , char ** argv)
{
    int a = 10;


    printf("the size of :%d\n",sizeof     (int)   );
    printf("the size of :%d\n",sizeof     (a)     );
//  printf("the size of :%d\n",sizeof     int     );    //錯誤的
    printf("the size of :%d\n",sizeof     a       );
//sizeof 得到unsigned int   它是關鍵字 不是函數


    char str1[] = "hello,world";
    char *str2  = "hello,world";


    printf("strlen : %d \n",strlen(str1));  // 1. 11
    printf("sizeof : %d \n",sizeof(str1));  // 2. 12
                                            //sizeof要多計算'\0'這一位!
    printf("strlen : %d \n",strlen(str2));  // 3. 11
    printf("sizeof : %d \n",sizeof(str2));  // 4. 8


    return 0;
}
#endif


#if 0
//實現strlen
#include<stdio.h>
size_t strlen(const char *p)
{
    register int i = 0;
    for ( ; *p++ != '\0' ; ++i )
        ;
    return i;
}


int main ( int argc , char ** argv )
{
     char * str = "hello,world!";
     printf("%d\n",strlen(str));
     return 0;
}
#endif




#if 0
#include<stdio.h>
float sum_float_elements(float *arr,unsigned int length)
{
    int i = 0;
    float result = 0.0;
    for(i = 0; i <= length - 1; ++i){
        result += arr[i];
    }
    return result;
}


int main (int argc , char ** argv)
{
    //類型提升問題:一般來講,signed類型遇到unsigned類型
    //              會提升爲unsigned類型
    //
    //
    float array[] = {12.4,2.5,0.6,23.23,12.44,50.6};
    float result = sum_float_elements(array,6);
//  float result = sum_float_elements(array,0);
//  如果把最後的參數改爲0
//  unsigned類型的第二個參數會變爲0-1後的unsigned int 的最大值
//  導致數組越界


//  *建議:儘量使用有符號的類型


    printf("result = %f\n",result);
    return 0 ;
}
#endif


#if 0
#include<stdio.h>
int main ( int argc , char **argv )
{
    ;                       //空語句
    8 + 3 ;                 //表達式


    int a = 10;
    float c = 5.6;
    float f = 5.6;
    double d = 7.5;
    int *p = &a;


    //順序執行的語句
    //1.
    //
    //分支語句
    //
    if(/*表達式*/1){
        //do sth.
    }else{
        //do sth.
    }
    //推薦使用的形式
    //
    //switch () 的優化 <- GCC 加什麼參數可以以表查詢
    //
    //switch cases中的值不連續的時候 編譯器會生成一個二叉樹進行查找
    //
    //
    return 0;
}
#endif


#if 0
#include<stdio.h>
#include<stdlib.h>


#define TRUE  (1)
#define FALSE (0)


typedef unsigned char Boolean;


Boolean func1(void);
Boolean func2(void);
Boolean func3(void);


Boolean func1(void)
{
    return FALSE;
}
Boolean func2(void)
{
    return FALSE;
}
Boolean func3(void)
{
    return FALSE;
}


int main (int argc , char **argv )
{
    Boolean ok = TRUE;
    int *p_int = NULL;


    //申請內存資源
    p_int = (int *) malloc (sizeof(int) * 10);
    if (p_int == NULL){
        printf("The memory is full!\n");
        exit(1);
    }
    #if 1           //連續檢測調用函數的返回值 ver.final
                    //&&的短路運算
    if (func1() == TRUE
    &&  func2() == TRUE
    &&  func3() == TRUE){
        ;
    }
    free(p_int);
    #endif
    #if 0 //連續檢測調用函數的返回值 ver.2
    do{
        if ((ok = func1()) == FALSE){
            break;
        }
        if ((ok = func2()) == FALSE){
            break;
        }
        if ((ok = func3()) == FALSE){
            break;
        }
    }while(0);


    free(p_int);
    #endif
    #if 0 //連續檢測調用函數的返回值 ver.1
    //分別調用函數
    ok = func1();
    if (ok == FALSE){
        free(p_int);
        exit(12);
    }


    ok = func2();
    if (ok == FALSE){
        free(p_int);
        exit(1);
    }


    ok = func3();
    if (ok == FALSE){
        free(p_int);
        exit(1);
    }


    free(p_int);
    #endif
    return 0 ;
}
#endif


#if 0
#include<stdio.h>
//break continue語句
int main ( int argc , char ** argv )
{
    int array [100] = {0};
    int i = 0;
    int j = 0;


    for ( i = 0 ; i <100 ; ++i ){
        for ( j = 0 ; ; < 100 ; ++j ){
            if ( i > 50 ){
               break ;    //break跳出最近的一層循環語句
            }
        }
    }
    //或者配合switch case---


    for ( i = 0 ; i <100 ; ++i ){
        for ( j = 0 ; ; < 100 ; ++j ){
            if ( i > 50 ){
               continue ;   //continue跳出本次循環,進入下一次循環
            }
            printf("I do not continued!\n");
        }
    }




}


#endif




#if 0
// goto
#include<stdio.h>
#include<stdlib.h>


#define TRUE  (1)
#define FALSE (0)


typedef unsigned char Boolean;


Boolean func1(void);
Boolean func2(void);
Boolean func3(void);


Boolean func1(void)
{
    return FALSE;
}
Boolean func2(void)
{
    return FALSE;
}
Boolean func3(void)
{
    return FALSE;
}


int main (int argc , char **argv )
{
    Boolean ok = TRUE;
    int *p_int = NULL;


    //申請內存資源
    p_int = (int *) malloc (sizeof(int) * 10);
    if (p_int == NULL){
        printf("The memory is full!\n");
        exit(1);
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    if ((ok = func1()) == FALSE){
         goto FAILED_FUNC;
    }


    free(p_int);
    return 0 ;




FAILED_FUNC:
    free(p_int);
    exit(1);


}
#endif


#if 0
#include<stdio.h>
//無返回類型的函數默認返回爲int?
sum (int a ,int b);


sum (int a ,int b)
{
    return a + b;
}


int main ( int argc, char **argv )
{
    // void a ;     //X -> 編譯器無法獲得分配內存的大小
    void * p ;      //V -> 指針在32位下4字節 64位下8自己
    //它可以接受任意類型指針,是泛型編程的基礎!
    //


    int result = 0 ;
    result = sum (10 , 20);


    printf("result = %d\n",result);




    return 0 ;
    //return 在void類型中可以作爲break使用*
}
#endif


#if 0
#include<stdio.h>


int main (int argc , char **argv)
{
    volatile int i = 10;
    //忽略編輯器的優化,每次對變量的訪問都從變量的地址讀取
    //安全, 防止多線程操作時的誤操作
    int j = i ;
    int k = i ;
    return 0 ;
}
#endif


#if 0
#include<stdio.h>


typedef struct List_node{
    int data;
    struct List_node *next;
}List_node;


typedef void(*Swap)(void *a , void *b);


//typedef void(*)(void *a , void *b)  Swap;     //<= 編譯器會報錯
// 一個意思-> 函數指針,Swap類型的變量可以指向形如
// void func(void *a, void *b)的函數


void func1(void *a , void *b);
void func1(void *a , void *b)
{
    ;
}




int main ( int argc ,char ** argv )
{
    Swap swap = func1;
    struct List_node a;
    List_node b;
    //一個意思
    //
    return 0;
}
#endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章