#include/* 最簡單的C語言程序為 main() {} 注意在有些開發環境可能這樣還不能運行,在cfree就說不法定位,在linux用gcc編譯運行成功 嚴格來說要返回一個整型,因為函數默認返回int型 */ struct test{ int a; int b; int c; } // 這裡也是存在一個有無 " ; " 的問題,沒有的話編譯器不報錯, // 編譯在struct結構體當成函數的返回類型,僅限後面是函數的情況下, // 當然這個情況限於func()函數沒有在調用前聲明,如果把這幾段程序放在mian函數後面, // 並在main函數前聲明func(),沒有加返回類型,但是應該有默認返回int類型; 因為在聲明時就確定了 // 返回類型 ,所以在這個情況下編譯是會報錯誤的 func() { printf("test\n"); } int main(int argc, char *argv[]) { /* 1、函數指針調用,如 p是一個函數指針,調用p指向的函數必須寫成(*p)();,寫成*p(),編譯器會解釋成*(p()); * 2、類型轉換也是單目運算符,單目運算符是自右向左結合,*p++被編譯器解釋成*(p++),即取指針p所指向的對象,然後將p遞增1;而不是 * (*p)++,即指針p所指向的對象,然後將該對象遞增1; */ int j,i = 3; switch(i) { case 3: printf("3\n"); case 1: printf("1\n"); break; // 這是i = 3;缺少break就一直執行到有break的地方,如果都沒break // 就執行到default結束; // 如果是你本人需要不加break,則好的做法是加上注釋 ,如/*此處沒有break*/ case 2: printf("2\n"); default: printf("default\n"); } while(i >= 0) //如果在這裡加了" ; " 這循環會影響代碼邏輯 ,而這些編譯不會報錯 { printf("i = %d\n",i); i--; } func(); // func();是可以輸出printf信息,返回類型沒有加;轉到上面有個隱含錯誤 func; // 上面的func();是函數調用;而這裡什麼也不做,精確講是計算函數地址 if (i < 0) return ; // 如果在這裡少了" ; " 則返回5,下面”i = 5;而這些編譯不會報錯“ // 在缺少" ; "情況下,當你的i>= 0時 ,i = 5;則被略過了,少了這條賦值 // 語句後續有關操作就會潛在潛伏一個很深,很難發現一個bug i = 5; j = 4; return 0; }
輸出: