溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言基礎(chǔ)及細(xì)節(jié)

發(fā)布時間:2020-08-26 15:23:01 來源:網(wǎng)絡(luò) 閱讀:380 作者:Wsundaysky 欄目:編程語言
簡單來說什么是C語言,就是用c寫的語言就是C語言。接下來言歸正傳。
1.沒有注意數(shù)據(jù)類型存儲范圍
     int main(int argc, char **argv)
     {
             char a;
             a = 1;
             for (a=0; a<128; a++)
                     printf("#");
             return 0;
     }
你猜是循壞了128,還是死循環(huán)呢? 答案是死循環(huán),因為a的類型是有符號char型,它的取值范圍為-128-127;當(dāng)a=127時,a<128,會繼續(xù)執(zhí)行,代碼執(zhí)行完之后a會加1,但是a的最大值為127,在加1就會變成最小值-128,為什么會變成-128呢,就是我們平時的時鐘,時間為12:59時,再過一分鐘就會變成1點,這就簡單的說明了為最大值加一會變成最小值,最小值減1就會變成最大值。在計算中數(shù)據(jù)都是以2進(jìn)制進(jìn)行存儲的,127在計算機(jī)存儲時為0x7f,加1,就會變成0x80,因為char中0x80表示最小值-128;所以-128小于128,以此類推,a<128;永遠(yuǎn)為真。

2.打印類型時,選擇正確的格式。
例如 double a = 4.5;
printf("%lf",a);
一定不能使用%f打印,否則會報警告
小結(jié):只要時double ,long類型的數(shù)據(jù)打印時別忘了加上l
3.顯示無符號整數(shù)
%u:顯示無符號整數(shù)
%o:顯示無符號八進(jìn)制
%x:顯示無符號16進(jìn)制
4.各種數(shù)據(jù)類型的變量與0進(jìn)行比較正確的書寫方式
int a=5;
if (0 == a);

 char ch = 'a';
 if ('\0' == char)

 float f =0.152;
 if ((x>-0.000 001) && (x<0.000 001))

 bool  flag = 1;
 if ( flag )

 int *p = &a;
 if ( NULL == p)

5.轉(zhuǎn)義字符:轉(zhuǎn)移字符是一種特殊的字符常量,轉(zhuǎn)移字符常以反斜線"\"開頭
常用的轉(zhuǎn)移字符:
\a:蜂鳴,響鈴
\b:回退:向后退一格
\f:換頁
\n:換行:光標(biāo)到下行行首
\r:回車,光標(biāo)到本行行首
\t:水平制表符
6.調(diào)試代碼有很多中一般分為printf調(diào)試,bug調(diào)試等、
我要講的是用printf調(diào)試,這種方式方便簡單易操作。
利用FILE,LINE,FUNCTIONDATE,
TIME實現(xiàn)代碼跟中
FILE:顯示代碼的文件名;
FUNCTION:顯示調(diào)用函數(shù)的名稱,沒有默認(rèn)為主函數(shù)
LINE:顯示所在的行數(shù);
TIME:顯示時間
DATE:顯示日期
7.數(shù)據(jù)類型的轉(zhuǎn)換
在多種數(shù)據(jù)類型混合運(yùn)算時,系統(tǒng)一般自動完成類型轉(zhuǎn)換
轉(zhuǎn)化的規(guī)則:存儲長度較短的轉(zhuǎn)化成存儲長度較長的,并且不丟失
(a)自動轉(zhuǎn)換 :
int a=5; double d = 4.5;
a + d ;結(jié)果是double類型的
(b)賦值轉(zhuǎn)換
int a=5; double d = 4.5; char ch;
ch = a + d ;結(jié)果是char類型的
(c)強(qiáng)制轉(zhuǎn)換
a = (int ) d + c;
字符型數(shù)據(jù)賦值給整型變量時,將字符數(shù)據(jù)放到整型變量存儲單元的低八位中
--對于無符號類型,則將字符的8位放到整型變量低八位中,高24位補(bǔ)零
--對于有符號字符類型,若最高位為0,整型變量高24為補(bǔ)0,若字符最高位為1 ,則高24位補(bǔ)1
char 0000 0001 --> 0000 0000 0000 0000 0000 0001
1111 1111 --> 11111 1111 1111 1111 1111 1111
將一個整型數(shù)據(jù)賦值給一個char類型變量時,直接將其低八位原封不動的送到char型變量(即截斷),精度會丟失。
將整型數(shù)據(jù)賦給浮點型變量時,數(shù)值不變,但以浮點型形式存放到變量中精度可能丟失;
將浮點型數(shù)據(jù)賦給整型數(shù)據(jù),直接將浮點型數(shù)據(jù)存放到int類型存儲空間中;
將浮點型賦給double類型數(shù)據(jù),直接將30--22位放到double類型62--52中,其他的放到剩下51位中,
將double類型數(shù)據(jù)賦給float類型,直接將取7位有效數(shù)字放到浮點型存儲空間中。

8.運(yùn)算符
運(yùn)算符是非常常見的,無論你用那種語言寫編程都會用到運(yùn)算符,談到運(yùn)算符,就會想到他的優(yōu)先級,這里我們不講他的優(yōu)先級,直降容易出錯的地方。
優(yōu)先級:不是誰的優(yōu)先級高就先算誰,所謂的優(yōu)先級就是結(jié)合型,誰的優(yōu)先級高就和誰結(jié)合,至于知怎算個的要根據(jù)優(yōu)先級運(yùn)算順序,相同的優(yōu)先級運(yùn)算順序時由編譯器決定的
(a) ++、 --
a++:就是獻(xiàn)給狀態(tài)值a;然后自行加一
++a; 先自加一,再給a+1的狀態(tài)結(jié)果;
-- a ; a++ 同理
(b) 不要對同一個變量,在一個表達(dá)式多次賦值
例如: a = 5;
c = a++ + a++ + a++; //編譯器不知道從那邊開始算
a = 5;
a = a++;同理
printf("%d %d %d %d %d\n", a++, a++, a++, a++, a++);
你要想這么做,就把a(bǔ)++ 結(jié)果賦值給其他變量,用其他變量進(jìn)行計算
(c) 位移(只能用于整數(shù)或者字符型)

                無符號數(shù)據(jù)類型:右移時左邊高位補(bǔ)0;左移時右邊補(bǔ)0;
                有符號:正數(shù):右移時,左邊補(bǔ)0;左移時右邊補(bǔ)0;
                                            負(fù)數(shù):右移時,左邊補(bǔ)1;左移時,右邊補(bǔ)0
                對于正數(shù)右移一位相當(dāng)于除以2,左移1位相當(dāng)于乘以2;
    (d)邏輯運(yùn)算符
                &  |  ^
                &  :兩者都是1,才為1,否則位0;  功能置零
                |   :兩者只有要一個為1,結(jié)果為1,否則為0,  功能置一
                ^   :  相同為假,不同為假, 功能取反
                舉例: &     A & 1 = A ; A & 0 = 0
                                    |       A  | 1 = 1;     A | 0 = A;
                                        ^       A ^ 1 = ~A ;  A ^ 0 = A;
        (e) 條件運(yùn)算符:三目運(yùn)算符
           表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3
             條件運(yùn)算符運(yùn)算有先后順序的:先算表達(dá)式1,若表達(dá)式1為真,算表達(dá)式2,結(jié)束,否則,計算表達(dá)式3,算完結(jié)束
             例題: a = b=c= 1;
                                    x = a++ ? b++ ?c--:c++:b--?c++:c--;
                                    結(jié)果為:a=2;b=2,c=1;
         (f)逗號運(yùn)算符
                 優(yōu)先級最低,將兩個表達(dá)式鏈接起來,從左往右以此計算、
                 注意:并不是任何地方的出現(xiàn)的逗號都是逗號運(yùn)算符,例如函數(shù)參數(shù),也是用逗號來間隔的

9.scanf和printf函數(shù):
   scanf:
     修飾符   功能
     m   :輸ru數(shù)據(jù)寬度,遇到空格或不可轉(zhuǎn)換字符結(jié)束
     *  :抑制符,指定輸入項讀入后不賦給變量

     輸入分割符的指定:
         一般以空格、TAB或回車鍵作為分隔符
         其他字符作分割符:格式串中兩個格式符間字符

例題:scanf("%d,%d,%d",&a,&b,&c);
                輸入方式必須以:12,13,14回車
            scanf("%d  ",&a);
            輸入 12   12回車才能結(jié)束否則不結(jié)束   過濾分割符,要輸入兩次
            scanf("a=%d",&a);
            輸入:必須以“a=”開頭+數(shù)字+回車 結(jié)束
            scanf("%*4d",&a);
            輸入:132345       a=45;
            scanf("%d%c",&a,&c);
            輸入 12回車  就結(jié)束了  因為%c會自動讀取回車、空隔

             char ch;
             int i;
             for (i=0; i<10; i++)
             {
                     printf("i=%d\n",i);
                     scanf("%c",&ch);
                     printf("%c\n",ch);
                     getchar();  //表示取走回車鍵,只能取走一次
             }
             %s he %c  遇到空格,回車鍵就自動停止
             scanf("%[^\n]",&a);//表示不取空格鍵
             scanf("%[a-z]",&a);//表示只取a-z

    10.switch:
        是一種多路判斷語句,他判斷表達(dá)式置是否與整型或字符常量例表中的某個值相匹配,若找到了相應(yīng)的匹配,就會執(zhí)行與常量關(guān)聯(lián)的語句,switch,case,和default都是關(guān)鍵字。語句可以時簡單或符合語句。
        switch后面只需要用圓括號括起來,而且switch的主題用{}括起來,計算表達(dá)式的數(shù)據(jù)類型與指定case常量數(shù)據(jù)類型匹配
        switch后的表達(dá)式可以包含任何變量名,也可以時常量
        case后面只能時常量(整型和字符型)
        case后面長量不能為相同,可以不按照順序,不影響程序結(jié)果,但是一般時按照順序。
        case 后面不加break,則表示找到匹配之后往下執(zhí)行,如果沒有遇到break;會執(zhí)行到程序結(jié)束,
        default:是說明沒有匹配的選項進(jìn)行說明,放到開始位置要加上break,否則會繼續(xù)執(zhí)行,放到末尾,就不用加了,執(zhí)行玩后就結(jié)束了
        例如:case 5: 語句 ;break;
                                case 5: 語句;break; //錯誤,有兩個相同的case,因為在匹配中不知道該選則那個,
                                case 1: 語句 ;break;
                                case 7 || 6: 語句;break; //錯誤7 || 6 返回狀態(tài)結(jié)果為1,與case 1:重復(fù) ,但是你可以這樣寫 case 6:     case 7: 語句;break;

last :一維數(shù)組和二位數(shù)組
講數(shù)組,就要集合,什么集合,就是把相同的東西放在一起。對于數(shù)組呢?也是一樣的,就是把相同的類型的數(shù)據(jù)放在一起,如果不用一個數(shù)組來存放相同數(shù)據(jù),用變量來表示,就會顯得雜亂無章,沒有條例性,時間久了,只有上帝知道,你所定義變量的含義了;接下來正式介紹數(shù)組
《存儲類型》 《數(shù)據(jù)類型》 變量名 [元素個數(shù)] //數(shù)組實際是由 元素數(shù)據(jù)類型+[元素個數(shù)]組成
存儲類型:說白了就是你定義了變量存放的位置。(一般默認(rèn)auto,放在棧中,當(dāng)代碼塊執(zhí)行結(jié)束就是放空間,static 為靜態(tài)類型,放在靜態(tài)取,用static定義數(shù)據(jù)存儲類型,知道程序結(jié)束才釋放空間,否則不釋放空間,extern聲明為全局變量,可以使用其他文件用extern聲明的變量,作用范圍用于整個函數(shù),register修飾符暗示編譯程序相應(yīng)的變量將頻繁的使用,如果可能話應(yīng)將放在CPU寄存器中,以加快其存儲速度)
int a[5]; //a實際可以看成 int [5] ;類型
//數(shù)組的大小在編譯的時候確定,而變量在運(yùn)行時才有值
//數(shù)組元素個數(shù)必須為整型或char類型
初始化:定義同時對變量或數(shù)組元素賦值
int a[3] = {1,2,3}; //全部初始化.
char ch[5] = {65,66,67}; //沒有初始化的部分自動清0
int be[100] = { [95] =15,} ; //指定元素初始化,沒有初始化的部分自動清零
int c[6];
c[2] = 2; //對元素賦值,不會影響其他元素,不對數(shù)組初始化,起內(nèi)存的存放的值是未知的,不對數(shù)組進(jìn)行越界檢查,對于越界的元素訪問可能造成不可預(yù)知的錯誤;
int cat[9];
cat[2] = 5; //[ ] 數(shù)組定義固定格式
2[cat] = 5; //引用變量時,[ ] 時變址運(yùn)算符 a[i] == (a+i) == (i+a) == i[a];

    數(shù)組名的含義:
    #define N 10
    int a[N];
    1.代表整個數(shù)組:只有子啊&a,和sizeof(a)
            &a得到的是整個數(shù)組地址
            sizeof(a)得到整個數(shù)組的字節(jié)大小
    2.其他情況數(shù)組名代表第一個元素的地址 即 a + 0 == &a[0], sizeof(a+0); 代表第一個數(shù)組元素的地址,是一個地址常量,不可以自加,不可以對數(shù)組名進(jìn)行賦值
      a++; //錯誤
        a = {1,23,5};//錯誤 
        int a[0]; 表示是一個地址,不能存放數(shù)據(jù)
    3.數(shù)組遍歷
       int a[10]= {0};
         int i;
         for (i=0; i<10; i++)
         {
                 printf("%d\n",a[i]);
         }

 4.int a[4] ;//數(shù)組在編譯時,空間就已經(jīng)確定了,變量在執(zhí)行的時候才申請空間賦值

      二維數(shù)組:其實是由一維數(shù)組組成的,內(nèi)存存儲空間時線性。
            int a[] [5];  //可以省略一維數(shù)組的下標(biāo);
            初始化:
            int a[5][5]= {15,6,3,9,7,8,2,1,5,4,6};//部分初始化,其他都清0;
            int c[8][9] = { [6][3]=9,};指定元素初始化,先定行,再指定行中的某一個

            二維數(shù)組名的含義:
            1.數(shù)組名:
                sizeof(數(shù)組名) ==>整個數(shù)組大小
                    &(數(shù)組名)        ==> 整個數(shù)組地址
            2.對于二維數(shù)組來說。每一個元素都是一個一維數(shù)組,數(shù)組名中放在第一個一維數(shù)組地址&a[0] ,除了上面的情況,都是代表了&a[0]  即 a == &a[0];
            int a[M][N];
    例如:     sizeof(a) ==  4*M*N;
                   sizeof(a[0]) == 4*N;
                                 sizeof(a[0][0]) == 4;

        遍歷:
        #define M  4
        #define N 5
        int main(int argc,char **argv)
        {
            int a[M][N]={0};
                int i,j;
                for (i=0; i<M; i++)
              {
                        for (j=0; j<N; j++)
                              printf("%d\t",a[i][j]);
                       printf("\n");
                    }
                    return 0;
                }
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI