C语言学习笔记

C语言知识点

标签(空格分隔): c


这篇文档将会不断更新

#include 
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 就不继续执行了

字符串要注意的###

char ccString1[]="Is Page Fault??";
char ccString2[]="No Page Fault??";
strcpy(ccString1,"No");
if(strcmp(ccString1,ccString2)==0)
   cout< 
  
  • Linux下多少个"-"将被打印:
    int main(void){
      int i;
      for(i=0;i<4;i++){
      fork();
      printf("-\n");
     }
     return 0;
    }
    考察fork()
    2+4+8+16 = 30
    

    堆与栈的区别###

    堆是使用malloc()、calloc()、realloc()等函数动态分配的,不可能静态分配,使用alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。

    不同平台上的字节数###

    (1)16位平台  
    char         1个字节8位 
    short        2个字节16位 
    int          2个字节16位
    long         4个字节32位 
    指针         2个字节16位  
    (2)32位平台  
    char         1个字节8位 
    short        2个字节16位 
    int          4个字节32位 
    long         4个字节32位
    long long    8个字节64位  
    指针         4个字节32位  
    (3)64位平台  
    char         1个字节 
    short        2个字节
     int         4个字节  
    long         8个字节(区别) 
    long long    8个字节  
    指针         8个字节(区别)
    
    #include 
    #include 
    
    struct A{
       unsigned int a; //对于开始连续的第一个8字节内存,a占4字节 
       char b[2];//b[]占1*2字节,在a后的连续2字节内存放,还剩2个
       double c;//c占8字节,第一个8字节还剩2字节不足以存放c,自动补充该2字节。并同时开辟第二个8字节内存存放c
       short d; //d占2字节,开辟第三个8字节,存放d。剩余的6个字节补齐。故总共开辟了8*3=24字节存放该数据结构
    
    };
    int main()
    {
        printf("%d\n",sizeof(A));
        getchar();
        return 0;
    }
    结果为24
    
    case 后面的常量表达式实际上只起语句标号作用 , 而不起条件判断作用 , 即 " 只是开始执行处的入口标号 ".  因此 , 一旦与 switch 后面圆括号中表达式的值匹配 , 就从此标号处开始执行 , 而且执行完一个 case 后面的语句后 , 若没遇到 break 语句 , 就自动进入 下一个 case 继续执行 , 而不在判断是否与之匹配 , 直到遇到 break 语句才停止执行 , 退出 break 语句 . 因此 , 若想执行一个 case 分之后立即跳出  switch 语句 , 就必须在此分支的最后添加一个 break 语句 .
    
    #include 
     
    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;
    }
    传值、传指针、传引用;其中传值不会改变变量的值,传指针和传引用会改变变量的值。
    传值的情况,函数的参数会产生临时空间,函数结束就会释放空间,因此不会改变主函数中变量的值;
    传指针即传递的是地址,将主函数中变量的地址传到函数中,而不会产生临时变量,因此会改变量的值;
    传引用的情况,就是传递的变量的别名,因此也会改变变量的值。
    
    C语言math库中floor函数和fabs的编写
    double floor(double x)
    {
        return (double)(int)x;
    }
    
    double Fabs(double x)  
    {  
        return x>1e-10?x:-x;  
    }
    
    
    C语言math exp(x)函数和log(x)函数的编写
    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;
    }
    详情见《实用数值算法》
    double Pow(double X,double Y)
    {
        return Exp(Y*Log(X));
    }
    
    double Sqrt(double X)  
    {  
      return Pow(X,0.5);  
    }
    

    你可能感兴趣的:(C语言学习笔记)