C的溫故知新

  前幾日看了張孝祥老師的C語言測試題,驚詫於自己在語法上的懵懂和經驗上的欠缺。昨天再次拾起了《C程序設計語言》,仔細複習了前三章,將自己平時不太注意的地方整理了一下。

1.關於整數之間相除的舍位,商的小數部分將全被捨棄,因此在有整數相除的連續運算中應該注意運算的順序

int celsius1 ,celsius2,fahrenheit = 100;
celsius1 = 5/9*(fahrenheit-32);//celsius結果是零
celsius2 = 5*(fahrenheit-32)/9;//輸出celsius結果是37,相對正確,但不夠精確
-------------------------------
float celsius3,fahrenheit2 = 100.0;
celsius3 =5.0/9.0*(fahrenheit-32);//輸出celsius結果爲37.777779
-------------------------------------------------------------------------
int fahrenheit = 100.5;//輸出fahrenheit結果爲100
即將float型賦給int型時,小數部分被截取掉。而將double賦給float時,是否四捨五入取決於具體的機器實現。

2.strlen(char* str)函數返回字符串參數str的長度,但不包括其末尾的'/0'。即它根據'/0'判斷字符串是否結束。

3.關於枚舉
    枚舉是一個常量整型值的列表。無顯式說明的情況下,第一個枚舉常量是0,第二個是1,往後類推。而如果對部分常量值進行了指定,那麼對未指定值的枚舉名的值將依最後一個指定值向後遞增。不通枚舉中的名字必須互不相同。同一枚舉中的不同名字可以有相同的值。枚舉相對於#define定義符號常量的優勢就是常量值可以自動生成。

4.continue語句只用在循環語句(for,while,do-while)中,不能用在switch語句中。

5.邏輯非運算符!將把非零操作數轉化爲0,將操作數0轉化爲1。

void main(void)
{
       int celsius1 = 9;

       if(celsius1==!!celsius1)
               printf("celsius1 equals !!celsius1/n");
       else
               printf("celsius1 does not equal !!celsius1/n");
}
運行結果
[dog@dog ~]$ ./test.out
celsius1 does not equal !!celsius1

6.關於變量的串聯賦值

void main(void)
{
       int i,j,k;
       i=j=k=0;

       printf("i=%d,/tj=%d,/tk=%d/n",i,j,k);
}
運行結果
[dog@dog ~]$ ./test.out
i=0,    j=0,    k=0

課本對此所述如下:在兼有值與賦值兩種功能的表達式中,賦值接合次序是由右向左.上面語句就是
i=(j=(k=0));
即把表達式k=0的值賦給了j,這裏就引出一點:賦值語句的值是多少?
void main(void)
{
       int i;
       if(i=9)
               printf("Y/n");
       else
               printf("N/n");
}
結果
[dog@dog ~]$ ./test.out
Y


void main(void)
{
       int i;
       if(i=0)
               printf("Y/n");
       else
               printf("N/n");
}
的結果是
[dog@dog ~]$ ./test.out
N
也就是說,賦值表達式的值就是右邊表達式的值.

7.關於變量的聲明(declaration)和定義(define)

    定義表示創建變量或分配存儲單元;而聲明只是說明變量性質,並不分配存儲單元

extern int a;
void main(void)
{
      printf("a = %d/n", a);
}

the compile process reports error as
[dog@dog ~]$ cc test.c -o test.out
test.c: 在函數 'main' 中:
test.c:28: 錯誤:stray '/226' in program
test.c:28: 錯誤:stray '/128' in program
test.c:28: 錯誤:stray '/156' in program
test.c:28: 錯誤:syntax error before '%' token
test.c:28: 錯誤:stray '/' in program
test.c:28: 錯誤:stray '/226' in program
test.c:28: 錯誤:stray '/128' in program
test.c:28: 錯誤:stray '/157' in program

In the program,variable a is only  declared ,but not defined,so the compiler can't find the definition of a.如果沒有變量a的定義,那麼任何對變量a的操作都是非法的,因爲這個變量還不存在。定義時可以給變量賦初值;但聲明變量時不能給它賦初值,原因是聲明的變量還沒有存儲空間。

8.“由於函數調用的參數是表達式,所以把參數傳遞給函數時也可能進行類型轉換。在沒有函數原型的情況下,char和short類型都將被轉換成int類型,float類型將被轉換成double類型。因此,及時調用函數的參數是char或float類型,我們也把函數參數聲明爲int或double類型。”

double d=(double)n
“強制類型轉化只是生成一個指定類型的n的值,n本身的值並沒有改變”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章