C語言入門教程之三表達式和語句

 一、表達式
    前面已經提到過表達式,相信大家對表達式也有了一個初步的認識,它是由常量、變量、運算符組合(到以後講函數時,函數也可以是組成表達式的元素),計算以後返回一個結果值。表達式的結束標誌是分號(;),C語言中所有的語句和聲明都是用分號結束,在分號出現之前,語句是不完整的。
    例如:
        1+2;
        Counter/3+5;
        Height*Width;
       
    表達式本身什麼事情都不做,只是返回結果值。在程序不對返回的結果值做任何操作的情況下,返回的結果值不起任何作用,表達式的作用有兩點,一個是放在賦值語句的右邊,另一個是作爲函數的參數(以後再介紹)。
    表達式返回的結果值是有類型的。表達式隱含的數據類型取決於組成表達式的變量和常量的類型。因此,表達式的返回值有可能是某種大小的整型,或者是某精度的浮點型,或者是某種指針類型。
    這裏面就有類型轉化的問題了,在前面說整型運算的時候也提到過。類型轉化的原則是從低級向高級自動轉化(除非人爲的加以控制)。計算的轉換順序基本是這樣的:
        字符型-->整型-->長整型-->浮點型-->單精度型-->雙精度型
    就是當字符型和整型在一起運算時,結果爲整型,如果整型和浮點型在一起運算,所得的結果就是浮點型,如果有雙精度型參與運算,那麼答案就是雙精度型了。
    強制轉換是這樣的,在類型說明符的兩邊加上括號,就把後面的變量轉換成所要的類型了。如:
      (int) a;
        (float) b;
    第一個式子是把a轉換成整型,如果原先有小數部分,則捨去。
    第二個式子是把b轉換成浮點型,如果原先是整數,則在後面補0。
    每一個表達式的返回值都具有邏輯特性。如果返回值爲非0,則該表達式返回值爲真,否則爲假。這種邏輯特性可以用在程序流程控制語句中。
    有時表達式也不參加運算,如:
        if(a||b) …………
        5>3?a++:b++;
    當a爲真時,b就不參加運算了,因爲不管b如何,條件總是真。   

二、語句
    (一)、賦值語句
        其實這個問題,在講賦值運算符的時候已經講了一些了。
            Amount=1+2;
            Total=Counter/3+5;
            Area=Height*Width;
        也許你會發現,這些賦值語句很象代數方程,在某些情況下,我們的確可以這樣理解,但有時它們是不一樣的。看下面:
            Num=Num+1;
        這顯然不是一個等式。
    (二)、用逗號分隔開的聲明語句
        C語言可大多數語言一樣,允許用逗號分隔聲明語句中的標識符列表,說明這些運算符是同一變量類型。例如:
            float Area,Height,Width;
        但有些程序員喜歡把標識符寫在不同的行上。如:
            float Area,
                  Height,
                  Width;
        這樣寫至少有一個好處,就是可以在每個標識符後邊加上註釋。
        在聲明變量的時候,也可以直接給變量賦值,這叫做變量的初始化。
        如:int a;
            a=3;
        等價於:
            int a=3;
        我們也讓某些變量初始化,某些不初始化,如:
            int a=3,b,c=5;
        在進行初始化時,初始化表達式可以是任意的(對全局變量和靜態變量有區別),由於逗號運算符是從左到右運算的,那麼看看這樣行不行?
          int a=3,b=a,c=5;
    (三)、標準輸入輸出語句
        Turbo C 2.0標準庫提供了兩個控制檯格式化輸入、輸出函數scanf();和printf();這兩個函數可以在標準輸入輸出設備上以各種不同的格式讀寫數據。scanf() 函數用來從標準輸入設備(鍵盤)上讀數據,printf()函數用來向標準輸出設備(屏幕)寫數據。下面詳細介紹這兩個函數的用法。
        1.標準輸入語句
            scanf()函數是格式化輸入函數, 它從標準輸入設備(鍵盤) 讀取輸入的信息。其調用格式爲:
                scanf("<格式化字符串>", <地址表>);
            格式化字符串包括以下三類不同的字符;
            (1).空白字符:空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。
            (2).非空白字符:一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
            (3).格式化說明符:以"%"開始,後跟一個或幾個規定字符,用來確定輸出內容格式。
              Turbo C 2.0提供的輸入格式化規定符如下:
            ━━━━━━━━━━━━━━━━━━━━━━━━━━
              符號        作用
            ──────────────────────────
              %d      十進制有符號整數
              %u      十進制無符號整數
              %f      浮點數
              %s      字符串
              %c      單個字符
              %p      指針的值
              %x,%X      無符號以十六進制表示的整數
              %o      無符號以八進制表示的整數
        ━━━━━━━━━━━━━━━━━━━━━━━━━━
          地址表是需要讀入的所有變量的地址,而不是變量本身,取地址符爲&apos;&&apos;。各個變量的地址之間同","分開。
          例如:
              scanf("%d,%d",&i,&j);         
          上例中的scanf()函數先讀一個整型數,然後把接着輸入的逗號剔除掉,最後讀入另一個整型數。如果","這一特定字符沒有找到,scanf()函數就終止。若參數之間的分隔符爲空格,則參數之間必須輸入一個或多個空格。
          說明:
              (a).對於各個變量,類型說明符是什麼,輸入格式化說明符就應該用對應的類型。否則會出現程序錯誤或輸入數據和理想的不一樣。
              (b).對於字符串數組或字符串指針變量,由於數組名和指針變量名本身就是地址,因此使用scanf()函數時,不需要在它們前面加上"&"操作符。
                      char *p,str[20];
                      scanf("%s", p);
                      scanf("%s", str);
                  具體字符串,指針的知識以後再介紹。
              (c).可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。
          如上例中若規定只能輸入10字符給字符串指針p,則第一條scanf()函數語句變爲:
              scanf("%10s", p);
          程序運行時一旦輸入字符個數大於10, p就不再繼續讀入。
          實際使用scanf()函數時存在一個問題, 下面舉例進行說明:
          當使用多個scanf()函數連續給多個字符變量輸入時, 例如:
            char c1, c2;
            scanf("%c", &c1);
            scanf("%c", &c2);
          運行該程序,輸入一個字符A後回車(要完成輸入必須回車),在執行scanf("%c",&c1)時,給變量c1賦值"A",但回車符仍然留在緩衝區內,執行輸入語句scanf("%c",&c2)時,變量c2輸出的是一空行,如果輸入AB後回車,那麼實際存入變量裏的結果爲c1爲A,c2爲B。
          要解決以上問題, 可以在輸入函數前加入清除函數fflush();(這個函數的使用方法將在本節最後講述)。
              (d).當在格式說明符之間加入&apos;*&apos;時,表示跳過輸入,例如:
                  scanf("%3*d",&a);
          當輸入12345的時候,前面三個字符跳過去不考慮,最終變量a的值爲45。
        2.標準輸出語句
            printf()函數是格式化輸出函數,一般用於向標準輸出設備按規定格式輸出信息。在編寫程序時經常會用到此函數。printf()函數的調用格式爲:
                printf("<格式化字符串>", <參量表>);
          其中格式化字符串包括兩部分內容:一部分是正常字符,
          這些字符將按原樣輸出;另一部分是格式化規定字符,以"%"開始,後跟一個或幾個規定字符,用來確定輸出內容格式。       
          參量表是需要輸出的一系列參數,其個數必須與格式化字符串所說明的輸出參數個數一樣多,各參數之間用","分開,且順序一一對應,否則將會出現意想不到的錯誤。
          對於輸出語句,還有兩個格式化說明符
            符號        作用
              %e      指數形式的浮點數
              %g      自動選擇合適的表示法
          說明:
              (1).可以在"%"和字母之間插進數字表示最大場寬。
                      例如: %3d  表示輸出3位整型數,不夠3位右對齊。
                            %9.2f 表示輸出場寬爲9的浮點數,其中小數位爲2,整數位爲6,小數點佔一位,不夠9位右對齊。
                            %8s  表示輸出8個字符的字符串,不夠8個字符右對齊。
                  如果字符串的長度、或整型數位數超過說明的場寬,將按其實際長度輸出。但對浮點數,若整數部分位數超過了說明的整數位寬度,將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度,則按說明的寬度以四捨五入輸出。
                  另外,若想在輸出值前加一些0, 就應在場寬項前加個0。
                      例如:  %04d 表示在輸出一個小於4位的數值時,將在前面補0使其總寬度爲4位。
                  如果用浮點數表示字符或整型量的輸出格式,小數點後的數字代表最大寬度,小數點前的數字代表最小寬度。
                      例如:  %6.9s 表示顯示一個長度不小於6且不大於9的字符串。若大於9,則第9個字符以後的內容將被刪除。
            (2). 可以在"%"和字母之間加小寫字母l,表示輸出的是長型數。
                  例如:  %ld  表示輸出long整數
                        %lf  表示輸出double浮點數
            (3). 可以控制輸出左對齊或右對齊,即在"%"和字母之間加入一個"-" 號可說明輸出爲左對齊,否則爲右對齊。
                  例如:  %-7d 表示輸出7位整數左對齊
                        %-10s 表示輸出10個字符左對齊
                一些特殊規定字符(可以參照前面說的轉義字符)
              ━━━━━━━━━━━━━━━━━━━━━━━━━━
              字符            作用
              ──────────────────────────
                /n          換行
                /f          清屏並換頁
                /r          回車
                /t          Tab符
                /xhh        表示一個ASCII碼用16進表示
            ━━━━━━━━━━━━━━━━━━━━━━━━━━
        由本節所學的printf()函數, 並結合上一節學習的數據類型, 看下面的語句,加深對Turbo C 2.0數據類型的瞭解。

            char c;
            int a=1234;
            float f=3.141592653589;
            double x=0.12345678987654321;
            c=&apos;/x41&apos;;
            printf("a=%d/n", a);      /*結果輸出十進制整數a=1234*/
            printf("a=%6d/n", a);      /*結果輸出6位十進制數a= 1234*/
            printf("a=%06d/n", a);    /*結果輸出6位十進制數a=001234*/
            printf("a=%2d/n", a);      /*a超過2位, 按實際值輸出a=1234*/
            printf("f=%f/n", f);      /*輸出浮點數f=3.141593*/
            printf("f=6.4f/n", f);    /*輸出6位其中小數點後4位的浮點數f=3.1416*/
            printf("x=%lf/n", x);      /*輸出長浮點數x=0.123457*/
            printf("x=%18.16lf/n",x);  /*輸出18位其中小數點後16位的長浮點數x=0.1234567898765432*/
            printf("c=%c/n", c);      /*輸出字符c=A*/
            printf("c=%x/n", c);      /*輸出字符的ASCII碼值c=41*/
        上面結果中的地址值在不同計算機上可能不同。
        當然還有一些輸入輸出函數,這個以後用到時慢慢再介紹。

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