P52: 宣告只表明變數特性,定義才實際配置記憶體。
P65: 當運算式用&&和||連接時,由左向右運算,一旦式子確定真偽,不論是否巡行完畢,式子都將立即結束。
ex. if ( A && B ) //如果A確定為False,則會直接跳出,不會運算到B。
P67: 外部變數或靜態變數如果未給初值,將自動設定為零。
P78: x *= y + 1 等同 x = x * ( y + 1 )
P109: 若涵式型別沒寫,則自動設定型別為int。 //經過測試,有的編譯器似乎無法通過,可能在之後的標準化中被修正了吧。
P124: 外部變數在宣告的同時也被定義了。(即配置記憶體空間)
P133: char pattern[] = "ould" 是 char pattern[] = { 'o', 'u', 'i', 'd' '\0' } 的簡化寫法。
P154: char s[] 可寫成 char *s
P156: 實作精簡版的malloc和free
P157: char *a = &alloc[0] 等同 char *a = alloc
P158: NULL定義在<stdio.h>
P158: 若P和Q都指向同一陣列的元素,則關係運算如<和>=等都可正常運作。例如說如果P指向Q之前,則P < Q為真
P159:
int Strlen( char *s )
{
char *p = s ;
while ( *p != '\0' )
p++ ;
return p - s ;
}
int Strlen( char *s )
{
char *p = s ;
while ( *++p ) ;
return p - s ;
}
P161: char str1[] = "now is the time" ; // an arrary
char *str2 = "now is the time" ; // a pointer
/* str1是個陣列,陣列內的每個字元都可以變動,但str1一定指向這塊儲存陣列的空間;
str2是個指標,初值指向一個字串常數。這個指標可以被修改而指向其他地方,如果企圖去修改字串常數,其結果難以預料。 */
P162:
void Strcpy1 ( char *s, char *t )
{
int i ;
i = 0 ;
while ( ( s[i] = t[i] ) != '\0' )
i ++ ;
}
void Strcpy2 ( char *s, char *t )
{
while ( ( *s = *t ) != '\0' ) {
s ++ ;
t ++ ;
}
}
void Strcpy3 ( char *s, char *t )
{
while ( ( *s++ = *t++ ) != '\0' )
;
}
void Strcpy4 ( char *s, char *t )
{
while ( *s++ = *t++ )
;
}
P176: 提供C語言的作業環境裡,有一種方法可以將命令列中的引數或參數傳遞給要執行的程式。當程式執行時,由main進入。main函式可以有兩個引數。第一個(通常寫成argc)是命令列中所提供的引數個數,第二個(argv)是指向含有命令列引數的字串陣列的指標。我們通常應用多層指標(Multiple levels of pointer)在處理這些字串。
P179: printf的格式引數部分也可以是運算式
ex. printf ( ( argc > 1 ) ? "%s " : "%s", *++argv ) ;
P187: int *f () ; // f: 傳回指向int的指標的函式 function returning pointer to int
int (*pf) () ; // pf: 指向具有int函式值的函式指標 pointer to function returning int
P240: 如何實作可變長度的引數列的函式。須先引入<stdarg.h>,裡面有規範幾個巨集可用來找出引數指標。(詳細請翻書)
ex. printf( char *fmt, ... )
C的繁複:
P77: return ( x >> ( p+1-n) ) & ~ ( ~0 << n ) ;
P81: for ( i = 0 ; i < n ; i ++ )
printf ( "%6d%c", a[i], ( i%10 == 9 || i == n-1 ) ? '\n' : ' ' ) ;
P184: 指向函式的指標的範例,整頁程式碼(請翻書)
P188: char ( * ( * x[3] ) () ) [5] ;
No response to “[NOTE]C程式語言(K&R 第二版)” ;
張貼留言