C語言知識點
標簽(空格分隔): c
這篇文檔將會不斷更新
#include <stdio.h>
int main()
{
int i=0,a=1,b=2,c=3;
i=++a||++b||++c;
printf("%d %d %d %d",i,a,b,c);
}
結果是1 2 2 3
解釋:||運算符的"懶惰性" ++a為2而且是或的關系 i肯定為1 就不繼續(xù)執(zhí)行了
字符串要注意的###
char ccString1[]="Is Page Fault??";
char ccString2[]="No Page Fault??";
strcpy(ccString1,"No");
if(strcmp(ccString1,ccString2)==0)
cout<<ccString2;
else
cout<<ccString1;
執(zhí)行strcpy(ccString1,"No"); ,ccString1變?yōu)?No\0Page Fault??",會將字符串的結束符'\0'放入,所以比較時返回false,執(zhí)行cout << ccString1; 輸出時遇到結束符'\0'就結束,只輸出“No”
----------------------------------------------------------------
char dog[]="wang\0miao;
sizeof(dog)為10
strlen(dog)為4
wang,miao占8個字節(jié)
'\0'占一個字節(jié) 但是會隱形的加上一個'\0'故sizeof(dog)為10
strlen()計算字符串長度遇到'\0'就停下來了
Linux下多少個"-"將被打?。?int main(void){
int i;
for(i=0;i<4;i++){
fork();
printf("-\n");
}
return 0;
}
考察fork()
2+4+8+16 = 30
堆與棧的區(qū)別###
堆是使用malloc()、calloc()、realloc()等函數(shù)動態(tài)分配的,不可能靜態(tài)分配,使用alloca()函數(shù)可以動態(tài)分配棧的內(nèi)存空間,釋放的時候由編譯器自己釋放。
不同平臺上的字節(jié)數(shù)###
(1)16位平臺
char 1個字節(jié)8位
short 2個字節(jié)16位
int 2個字節(jié)16位
long 4個字節(jié)32位
指針 2個字節(jié)16位
(2)32位平臺
char 1個字節(jié)8位
short 2個字節(jié)16位
int 4個字節(jié)32位
long 4個字節(jié)32位
long long 8個字節(jié)64位
指針 4個字節(jié)32位
(3)64位平臺
char 1個字節(jié)
short 2個字節(jié)
int 4個字節(jié)
long 8個字節(jié)(區(qū)別)
long long 8個字節(jié)
指針 8個字節(jié)(區(qū)別)
#include <stdio.h>
#include <stdlib.h>
struct A{
unsigned int a; //對于開始連續(xù)的第一個8字節(jié)內(nèi)存,a占4字節(jié)
char b[2];//b[]占1*2字節(jié),在a后的連續(xù)2字節(jié)內(nèi)存放,還剩2個
double c;//c占8字節(jié),第一個8字節(jié)還剩2字節(jié)不足以存放c,自動補充該2字節(jié)。并同時開辟第二個8字節(jié)內(nèi)存存放c
short d; //d占2字節(jié),開辟第三個8字節(jié),存放d。剩余的6個字節(jié)補齊。故總共開辟了8*3=24字節(jié)存放該數(shù)據(jù)結構
};
int main()
{
printf("%d\n",sizeof(A));
getchar();
return 0;
}
結果為24
case 后面的常量表達式實際上只起語句標號作用 , 而不起條件判斷作用 , 即 " 只是開始執(zhí)行處的入口標號 ". 因此 , 一旦與 switch 后面圓括號中表達式的值匹配 , 就從此標號處開始執(zhí)行 , 而且執(zhí)行完一個 case 后面的語句后 , 若沒遇到 break 語句 , 就自動進入 下一個 case 繼續(xù)執(zhí)行 , 而不在判斷是否與之匹配 , 直到遇到 break 語句才停止執(zhí)行 , 退出 break 語句 . 因此 , 若想執(zhí)行一個 case 分之后立即跳出 switch 語句 , 就必須在此分支的最后添加一個 break 語句 .
#include <stdio.h>
int main()
{
char x = 'B';
switch (x){
case 'A':printf("A");
case 'B':printf("B");
case 'C':printf("C");
default: printf("D");
}
結果為BCD
void change(int*a, int&b, int c){
c=*a;
b=30;
*a=20;
}
int main ( ){
int a=10, b=20, c=30;
change(&a,b,c);
printf(“%d,%d,%d,”,a,b,c);
return 0;
}
傳值、傳指針、傳引用;其中傳值不會改變變量的值,傳指針和傳引用會改變變量的值。
傳值的情況,函數(shù)的參數(shù)會產(chǎn)生臨時空間,函數(shù)結束就會釋放空間,因此不會改變主函數(shù)中變量的值;
傳指針即傳遞的是地址,將主函數(shù)中變量的地址傳到函數(shù)中,而不會產(chǎn)生臨時變量,因此會改變量的值;
傳引用的情況,就是傳遞的變量的別名,因此也會改變變量的值。
C語言math庫中floor函數(shù)和fabs的編寫
double floor(double x)
{
return (double)(int)x;
}
double Fabs(double x)
{
return x>1e-10?x:-x;
}
C語言math exp(x)函數(shù)和log(x)函數(shù)的編寫
double Exp(double X)
{
double Result=1.0,Precious=X,Xn=1.0,Fac=1.0;
int n=1;
while(Precious>1e-6)
{
Fac*=n;
Xn*=X;
Precious=Xn/Fac;
Result+=Precious;
n++;
}
return Result;
}
double Log( double a )
{
int N = 150;
int k,nk;
double x,xx,y;
x = (a-1)/(a+1);
xx = x*x;
nk = 2*N + 1;
y = 1.0/nk;
for(k=N;k>0;k--)
{
nk = nk - 2;
y = 1.0/nk + xx*y;
}
return 2.0*x*y;
}
詳情見《實用數(shù)值算法》
double Pow(double X,double Y)
{
return Exp(Y*Log(X));
}
double Sqrt(double X)
{
return Pow(X,0.5);
}