第一個範例,static 的用法
算費式數列到50項,
#include <stdio.h>
long long int fibonacci(){
static long long int first = 0;
static long long int second = 1;
long long int out = first+second;
first=second;
second=out;
return out;
}
int main(){
for (int i=0; i< 50; i++)
printf("%lli\n", fibonacci());
}
作者是介紹static, 每次進入函數,離開函數,基本上static 變數,值會留下,
即使宣告在函數的內部。看著他寫 long long很有意思,我改成long long long ,
--------------------------------------
long long long int fibonacci(){
static long long long int first = 0;
static long long long int second = 1;
---------------------------------------
多一個long, make 一下,
訊息是,
fibo_long.c:6:11: error: ‘long long long’ is too long for GCC
long long long int fibonacci(){
^
這個error訊息挺白話的,3個long太長了,對GCC而言。
第二個範例是結構的複製
#include <assert.h>
typedef struct{
int a, b;
double c, d;
int *efg;
} demo_s;
int main(){
demo_s d1 = {.b=1, .c=2, .d=3, .efg=(int[]){4,5,6}};
demo_s d2 = d1;
d1.b=14;
d1.c=41;
d1.efg[0]=7;
assert(d2.a==0);
assert(d2.b==1);
assert(d2.c==2);
assert(d2.d==3);
assert(d2.efg[1]==6);
}
一行指令就可以demo_s d2 = d1; 複製結構。
a 沒有給值,是0,這點比較特別。
試試改一下assert裏的判斷式,
copystructs_ass: copystructs_ass.c:24: main: Assertion `d2.efg[1]==6' failed.
已經終止 (core dumped)
一遇到錯,就終止。
第3個例子
int main(){
int abc[] = {0, 1, 2};
int *copy = abc;
copy[0] = 3;
assert(abc[0]==3);
例2和例3 對比,終於看出作者要表達的意思。
例3 把陣列指向指標時,基本上是佔用同一位址。所以改指標指向的值,原陣列會被改變。
例2 把結構d2 = 結構d1, 分佔不同的位址,所以改結構d1, d2並不會被影響到,但是結構中有一成員是指標,這是這個成員,d1和d2是共用位址的,所以d1.efg[0] 改動,d2.efg[0]會一起改。
小結:筆者學語言,很少學得很細,所以這些很基礎的觀念,十年前,可能看過就忘了,並不了解其意思。作者精心設計的範例,讓人反覆看了幾遍,能理解其深意。作者舉的例子短小卻深刻。