C语言拾零(to be continued)
1.1個空格鍵=2個\x20的效果,你們發現了嗎。
2.C語言中字符和ASCII碼是一一對應的。
3.浮點數有有效位數的要求,所以比較兩個浮點數是否相等,只需要比較他們的差值是否在一個范圍內即可。
4.隱式轉換的順序呢由(char、short)->?int->unsigned->long->double?<-(float)
5.C語言中運算符的結核性是其他高級語言所沒有的。
6.printf中要出現%,要加兩個,形同%%。
7.“/”運算符,左右如果出現負的,那么符號看op1,然后大都采用向零取整的方法。
8.關系運算符中==和!=的優先級最低。
9.一般認為邏輯與&&的優先級大于邏輯或||。
10.判斷閏年的條件:能被4整除但不能被100整除,或能被400整除
?????year%4==0&&year%100!=0||year%400==0
11.a>b?a:b?類似的條件表達式,結合性同賦值運算符一樣是右結合的
12.復合賦值運算符右邊的表達式應該作為一個整體來看待。?a+=b+c???<=>????a=a+(b+c)
13.遇到+++時,采用從左到右的最長匹配原則。
14.C中自增自減操作比同效果的賦值運算要快得多,所以可以多用。
15.逗號表達式的優先級最低,且整個逗號表達式的值(一般不求)是最右邊一個的值。
16.!p++,!和++優先級相同,且都是右結合。
17.switch后邊不能跟浮點型,且多個case語句可共用一組執行語句。
18.c語言中的數值定義之后,要使用必須要進行初始化,不然會是系統分配的隨機值。
19.變量的聲明,只是類型。而定義則不僅包括聲明,還包括內存空間的分配。
20.for語句后邊不能加分號;,否則循環執行體部分就成了空語句,
21.寫循環時要注意先找尋累加量之間的關系,可以幫助減少循環的層數或者循環變量的使用。
22.注意小細節,例如?sum=sum+i/(i+1.0),此時就必須是1.0,否則該表達式的值就一直為0.
23.語言真的只是工具,重在思想方法!例如最小公倍數求法,用兩數相乘再除以最大公約數即可.
24.經典的菱形問題,空格數為n-i,?星星數為2i-1(n為總行數,i為當前行數)
25.在循環的嵌套問題中,內層循環變量往往與外層循環變量相關。
26.?if(n%10==0)?printf("\n");像這種加一個變量的方法,可以用來控制輸出的個數。
27.continue結束內層循環;break由內層循環跳到外層循環(即結束本層)。
28.格式控制中的%md,其中m限制了數據寬度,原數據不夠m長,前補空格。%m.nf,效果如前,加負號之后,%-m,就是改成后補空格;%f,小數點后保留6位,第7位四舍五入。
29.%u無符號表示一般是%d有符號十進制的兩倍。
30.%m.ns,作用是輸出m位字符,從左端截取n位字符,n<m,前補空格。加負號后,后補空格。
31.內存中二進制轉化為%o,%x的時候,如果帶有符號位,則也作為轉化后的一部分進行輸出。
32.scanf函數的控制串中,%之間可以是空白符,也可以是字符或字符串。
33.printf("\n"),和putchar('\n')的作用是一樣的,一個單引號一個雙引號。
34.數組變量和指針變量可以存儲字符串。
35.puts()函數的作用是輸出字符串并換行,因為它在遇到\0時會自動轉化成\n。
36.數組在定義時,不能是常量。
37.調用函數時變量是按照傳值的方式傳遞,形參的改變不會影響實參。
????數組是按照傳地址的方式傳遞,形參的改變會影響實參。因為實參形參指向的是同一塊存儲區.
38.數組逆序設計的兩個數字一般是?i?和?n-1-i。?N為數組元素的個數。
39.在交換兩個數的值時,可以用的方法有臨時變量、異或和加減,但是在當作為參數進行傳遞時,只有傳地址和傳指針的方法可以讓形參的改變,改變實參的值。其中用異或方法的時候,必須是取地址。
40.在scanf函數中,如果輸入的是字符串數組,那么在寫的時候就不用加&號了,因為數組的名字本身就代表地址。
41.switch里邊不能是浮點型;多個case共用一個執行語句時,只需要?case:?即可,不用加別的。
42.數組的初始化可以使用{}來進行,字符串數組的初始化可以直接使用""字符串即可,可省略大括號;且對于數組的操作一般分為3個部分,初始化,修改值,循環輸出。
43.printf與puts沒有太大區別;但scanf和gets則區別較大,scanf在遇到空白符、回車時就結束輸入,而gets只有在遇到回車時才結束輸入。?eg.hello?world.
44.在進行字符串的連接、賦值等操作時,一般判斷的依據就是結束標志\0.并且別忘記在最后生成的字符串后邊添加結束標志。
45.函數的定義中可以調用其它函數,但是c語言不支持函數的嵌套定義。
46.return語句可加括號也可以不加,起作用就是講表達式的值返回給主調函數。
47.如果要將多個值返回主調函數,用return是無法實現的。
48.形參在調用前沒有具體值,在函數調用后才分配內存,調用結束后內存會釋放。
49.實參與形參之間是單向傳遞的值傳遞。形參實參占用不同的內存單元。
50.引用調用,是把實參的地址賦值給形參,被調函數使用這個地址才存取實際的變量。
51.有參函數的聲明中,參數的聲明,只需要給出參數額類型即可。然后加上分號。
52.什么時候可以省略函數聲明:外部已經聲明;被調函數定義在主函數之前;返回值的類型為整形或字符型。
53.C語言的特點之一就是允許函數的遞歸調用。例如階乘的運算,斐波那契數列、漢諾塔等。
54.一般的函數都具有外部性質,可以被整個源程序的函數調用。但是如果加上static(并非指存儲方式)那么該函數就變成內部函數,只能被本文件的函數調用,而不能被同一源程序其他文件的函數調用。在一個源文件的函數中,調用其他源文件中定義的外部函數通常使用extern來進行說明,在定義時則可省略不寫。
55.main函數的參數,main(int argc,char *argv[]).其中參數一指的是命令行參數的個數。往往文件名也算一個。eg;08-12 ?i am happy!(共4個參數);參數二指的是指向字符串的指針數組,存儲的是每個字符串的首地址,另外要注意的是,在命令行中的輸入都將作為字符串存儲于內存中。如果輸入了一個數字,現在要輸出,那么要使用%s,而非%d.
56.函數體內部使用的局部變量包括形式參數和函數體內定義的參數。
57.x=rand()*101+100(表示的就是100-200間的數字;rand()表示0-1)
58.變量的作用范圍產生沖突時,以小范圍的優先。全局變量的使用增加了函數間傳遞數據的途徑,有助解決多個返回值的問題。
59.按照變量的生存期來劃分,可分為靜態變量(變量類型:static,extern);動態變量(變量類型:auto,?register,);auto為默認,register可由編譯系統的優化來解決;
60.C語言規定靜態局部變量有初始值,int 0,float0.0,char '\0',而自動和寄存器沒初始值,是隨機值。
61.靜態局部變量,程序開始時及分配內存,仍具有局部特性,離開函數,不起作用,但仍然存在!并且由于這個特性,含有該變量的函數不管多少次執行,都保留上一次調用時的值。
#include<stdio.h>
long fac(int a)
{
static long f=1;
f=f*a;
return f;
}
void main()
{
int a,i;
long f;
a=5;
for(i=1;i<=a;i++)
{
f=fac(i);
}
printf("%ld!=%ld\n",a,f);
}
62.靜態全局變量只能被某一程序中,定義它的某個文件所獨享。
#include <stdio.h>
int n;
int main()
{
n=100;
printf("%d\n",n);
f(5);//輸出是50而不是500,說明兩個n是互不干涉的,靜態局部變量只在定義它的文件內有效。
}
#include<stdio.h>
static int n;
int f(int x)
{
n=10;
n*=x;
printf("%d\n",n);
}
63.對數據的訪問分為直接訪問和間接訪問,直接訪問是通過變量實現,變量實際是存儲區域的名稱;間接訪問通過指針實現,指針存儲的是數據在內存中的地址。
64.變量a的內存地址就是變量的指針,用另一個變量b來存儲該變量a的指針,那么變量b就叫做指針變量。
65.指針變量在使用前必須被初始化,賦值為0的指針變量成為空指針。
66.當用指針變量來排序比較大小時,用臨時變量法交換大小,用的一般是地址。及*p1的p1
67.使用函數交換兩個指針時,可以交換*p或者p,兩者的不同是,前者才可以改變實參的值。可畫圖分析。
68.定義int a=1,b=10;這樣a,b就會依次存儲在棧中,且棧是向低地址擴展的一種存儲結構,所以定義 int*p=&a;那么p-1實際就是變量b的存儲空間的地址。針對這類連續存儲空間,使得指針可在數組中進行類似的操作。
69.指針與函數的關系
①指向函數的指針:eg ?int(*p)(int,int) ?其中p存儲的是函數的入口地址,賦值時只需要讓p=(max)函數名即可。
②返回指針的函數:int*max(int x[], int y[], int *p, int *n),具體使用時 p=max(x,y,&n,&c);其中&n等就是引用的方法,目的是使函數返回多個返回值。
70.void指針用于指向一個抽象類型的數據,在賦值給其他指針變量時需要進行強制類型轉換。當然也可以將一個函數賦值為void*型,用時也要轉換。
71.數組賦值 for(i=1;i<n;i++) scanf("%d",&array[i]);
72.考慮問題由上到下,層層細化。考慮清楚后,針對循環,要從外到內設計,從里到外實現。
73.二維數組中指針的運算。
特別注意,在二維數組中,輸出元素的方法:
①下標訪問就直接:array[i][j] ?//i,j分別表示行列。
②數組名訪問:*(*(array+i)+j)
③指針來訪問:p=&array[0][0] ?*(p+3*i+j) ?//實際就當做一維的來運算
74.指針作為參數傳遞給函數,分兩種情況,一種是指針變量,另一種是數組的指針。即具體分形參實參分別為數組和指針兩種情況。
75.一般指針變量具有的操作有自加、自減,或加某個數字等等。
76.經典例統計字母出現次數的例題中:if(*p>='a'&&*p<='z') arr[*p-'a']++; //程序設計的藝術性體現
77.一般指針與字符串相結合的處理,一般的操作就是: char str[10]; char *p; p=str; ?//因為此時str應為常量,如果涉及字符串每個字符的處理,就應這樣做,就可以用p++,來進行處理。
78.指向字符串的指針,或字符串數組,輸出時不用控制,可以直接用%s輸出,然后printf的參數用指針變量名或者數組名。eg:printf("%s \n".p);
79.指針數組是指數組由指針類型的元素構成。eg: char *seasons={"spring","summer","winter","autum"}; char **p;
應用時 p=seasons+i; ?seasons[i]已經是指針,那么seasons +i 就是指針的指針,同p同類型,*p=*(seasons +i),即表示seasons[i],表示第i個字符串的首地址,對應用作輸出每個字符串。
80.數組指針 int(*p)[10] ?表示用p來指向含有10個元素的整形數組。eg: int array[2][3]; int (*p)[3]; 就可以這樣賦值 p=array,因為array表示下標為0的那一行,且該行有3個元素符合定義;輸出時可用p[i][j]來輸出,它等同于*(p+i)[j]==*(p[i]+j)==*(*(p+i)+j)
81.進行位運算時(如a & b,而a為long型,b為int型),系統會將二者按右端對齊。系統會據b的類型進行高位補齊。
82.設置一個低4位全為1,其余全為0的數。?~ ( ~ 0 << 4 ) ; 實現循環右移:b=a<<(m-n) ; c=a>>n; c=c|b;
83.位段成員的類型必須制定為unsigned或者int類型。
84.ASCII文件,每個字節存放一個ASCII碼;二進制文件即數據在內存中的存放形式。
85.文件操作習慣這樣的寫法:if(in=fopen(infilename,'r'==NUll) ) {printf("can not open the file\n"); exit(0);}
while(!feof(in)) fputc(fgetc(in),out);//實現文件的復制,文本文件。 ? ?fclose(in);//文件的關閉操作。
86.?數據塊讀寫函數 fread(f,4,2,fp);?此函數從fp所指向的文件中讀入2個4個字節的數據,存儲到數組f中。還有fwrite函數,用法類似。
87.因為涉及形參實參的關系,所以在主函數和被調用函數中往往出現相似的賦值和操作!!!
88.格式化讀寫函數fprintf(),fscanf(),對磁盤文件進行讀寫,但輸入時要把ascii碼轉換成二進制形式,輸出時相反,所以在內存與磁盤頻繁交換數據時,盡量避免使用該倆函數,而用fread和fwrite來代替。
89.對磁盤文件讀寫一個數(整數)putw(10,fp);i = getw(fp);
90.fgets(str,n,fp),作用從指定文件讀入一串(n-1個字符,'\0'算上)字符。str為起始地址。
91.fputs(p,fp),作用向指定文件輸出一串字符。p可以是字符串,字符串指針,或者字符數組名。
92.注意文件操作中對文件的定位。
①fseek(文件類型指針,位移量,起始點),eg: fseek(fp,10L,0) //將文件指針移動到離開始位置。1為當前位置,2為文件結尾。一般用于二進制文件,一般和fread想配合使用。跟結構體配合使用時常出現 sizeof(struct student_list)
②rewind(fp) //將指針重新定位回文件的開頭。
③ftell(fp) //得到流式文件當前的指針位置,正確返回int型值,離開始位置的偏移量;錯誤返回-1L.
93.錯誤處理:
①ferror(fp) ?返回0表示未出錯,返回非0表示出錯了。
②clearerr(fp) 使文件錯誤標志和文件結束標志清0
94.文件結束標志 feof(fp) 如果結束的話返回的值是 真。
95. 隨機函數常用的:srand((usigned)time(NULL)); //隨機時間播種
96.用這種方法可以創建一個數組。可能是內部實現。
97.用malloc申請的是空閑內存,一般以堆的形式來存儲。
98.qsort使用實例:
qsort((void *)intarr, num, sizeof(intarr[0]), sortcmp);
int sortcmp(const void *a,const void *b)
{
return *(int*)a-(int*)b; //,字符的也可這樣算,double型數組、結構體用條件運算符,不直接相減}
99.遞歸和非遞歸的轉換往往只差一層循環而已!eg:二分查找的遞歸和非遞歸程序!
100.數組從0開始和從1開始也往往只在判斷條件上差一個等號!
101.exit(N),用來傳給操作系統N值,作用是結束整個程序,N值可用來表示是否正常退出等等情況。
102.冒泡排序中記得兩個參數i,j 其操作分別是N個數,i為pass數=N-1; j為比較次數=N-i;最后的效果是大的沉到下邊.交換次數較多。
void bubblesort(int a[], int n)
{
? ? int i,j,t;
? ? for (j=0; j<n‐1; j++)
? ? ? ? for(i=0; i<n‐j; i++)
? ? ? ? ? ? if (a[i]>a[i+1])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? t=a[i];
? ? ? ? ? ? ? ? a[i]=a[i+1];
? ? ? ? ? ? ? ? a[i+1]=t;
? ? ? ? ? ? } ?
? ? return;
}
103.選擇排序是每次選出最小的放到前邊。起操作是N個數,i為pass數=N-1;具體是j算做標志=n+1; 交換次數較少。
void select_sort(int array[],int n) //形參array是數組名
{
? ? int i,j,k,t;
? ? for(i=0; i<n‐1; i++)
? ? {
? ? ? ? k=i; ?//先設第i個就為最小,程序設計中假設的使用可以極大地方便程序員的編程和代碼的優化。eg.if語句中的思維假設。
? ? ? ? for(j=i+1; j<n; j++)
? ? ? ? ? ? if(array[j]<array[k])
? ? ? ? ? ? ? ? k=j; ? //通過循環,得到k為最小
? ? ? ? t=array[k]; ? ?//交換a[i]和a[k]
? ? ? ? array[k]=array[i];
? ? ? ? array[i]=t;
? ? }
? ? return;
}
104.數學公式的計算往往涉及構造一個包含很多參數的函數:eg:
int p(int a, int x[], int b, int y[], int n)
{ ?int i, s;
? for(_i=0,s=0; i<n; i++)
? ?s+=a*x[i]+b*y[i];
? ?return s;
}
105. cpp:不能用賦值語句將一個字符串常量或字符數組直接賦給一個字符數組。字符串的比較和賦值都要用到函數,strcmp 和strcpy. 此外還有 strcat, strlen, strlwr, strupr and so forth. 要想直接賦值的話,倒也可以,就是包含stirng 頭文件后,再定義相應的字符串變量就可以了。
106.有些函數不需要調用者,只需要寫出即可 eg: strrev(p); 因為這類函數的內部實現機制已經規定好了是反轉完畢后,存到原來的數組中去,且并不返回相應內存單元的地址。
107.一種字符串輸出方式:
/****************************************************************************/
108.exit(0),exit(1),return釋義:
1. return返回函數值,是關鍵字;? exit 是一個函數。
? 2. return是語言級別的,它表示了調用堆棧的返回;而exit是系統調用級別的,它表示了一個進程的結束。
? 3. return是函數的退出(返回);exit是進程的退出。
? 4. return是C語言提供的,exit是操作系統提供的(或者函數庫中給出的)。
? 5. return用于結束一個函數的執行,將函數的執行信息傳出供其他調用函數使用;exit函數是退出應用程序,刪除進程使用的內存空間,并將應用程序 的一個狀態返回給OS,這個狀態標識了應用程序的一些運行信息,這個信息和機器和操作系統有關,一般是?0 為正常退出,?非0 為非正常退出。
6. 非主函數中調用return和exit效果很明顯,但是在main函數中調用return和exit的現象就很模糊,多數情況下現象都是一致的。
109.
110.
總結
以上是生活随笔為你收集整理的C语言拾零(to be continued)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MIT_18.03_微分方程_Convo
- 下一篇: Matlab拾零(to be conti