c语言变态语法一

来源:互联网 发布:excel每隔n列取数据 编辑:程序博客网 时间:2024/05/01 22:07


         比较杂乱的记录的一些c语言的变态语法,或者说一些比较少见的,又或者说是一些比较容易忽略的语法,形式整理的不怎么好。

 我将这些需要注意的问题通过代码注释的形式写在了代码之中,粘贴下来便可以调试运行查看结果。


#include <stdio.h>#include <stdlib.h>#include <string.h>void memcpy_w(char *dest,char *source,int k){    while(--k > 0)        *dest++ =  *source++;}double Func(); main(){/*    生僻语法一:    整型常量开始如果为0,将被解析为8进制的格式,或者    16进制的格式*/  int a,b,c;//scanf("%d %d",&a,&b);/*  如果规定了输入格式,那么后面的00215将为215,  下面的直接定义的结果为141,0215将为8进制的数*/  a= 0215;          //8进制  b=215;            //10进制  c= 0x215;         //16进制//a=a/ *b;  printf("a: %d b: %d c: %d\n",a,b,c);/*    二:单引号和双引号不同,单引号引起的一个字符代表一    个整数,如'a'代表0141(8进制),或者97(10进制),    双引号引起的字符串代表的是指向无名数组起始字符的指    针,数组被双引号之间的字符及一个额外的二进制值为0    的字符'\0'初始化,如下面例子输入的结果相同*/  printf("Hello\n");  char hello[]={'H','e','l','l','o','\n',0};  printf(hello); /*   编译器能够在+连续的情况下报错  int x=2;  int y=1;  int z=x+++ ++y;  printf("z: %d\n",z);*/ /*  易混淆情况如下  如果声明 float *g(),(*h)();  *g() 与 (*h)()是浮点表达式,因为()结合性高于*,  *g() 也就是*(g()),g是一个函数,该函数的返回值  为指向浮点数的指针,h是一个函数指针,返回值为  浮点类型 */ /*  变态语法三:  可以将函数的声明甚至可以写成如下的样子:  (*(void(*)())0)();  表示硬件调用首地址为0位置的子程序 */// int d=0;// (*(void(*)())0)();//printf("%d",d);    int d=2;    switch(d)    {        case 1: printf("1\n");    break;        case 2: printf("2\n");    break;      //不用加大括号        case 3: printf("3\n");    break;    }/*    易混淆:        在下面的程序中,可能会出现死循环的情况,如果        编译器按照内存地址递减的方式给变量分配内存,        那么内存中数组a之后的一个字实际上是分配给了        整型变量i,即本来不存的a[10]的值实际上是给了i,        这样就陷入了死循环。不要惊讶就好!!!        但我用codeblock编译,没有出现死循环在使用vc++6.0 运行下面的程序时,出现了死循环,通过调试发现,i回到了0,即出现了上面所说的情况最好是能够亲自试验一下*/  /*  int i,e[10];    for(i=0;i<=10;i++)        e[i]=0;    printf("over\n");  */    char *source = "hello World\n";  //此处下面需要分配  //char *dest = (char *)malloc(sizeof(1));  //char *dest = (char *)malloc(sizeof(15));    char dest[1];  //只要给其实地址分配了内存,后面的就都是连续的存储空间,    memcpy_w(dest,source,14);    printf("dest: %s",dest);    int bignuma=999999999;    int bignumb=bignuma;    int num=bignuma + bignumb;    printf("num : %d\n",num); /*    易错难找的bug:        数据上界溢出,导致错误的结果,这个是比较难找到的错误!!!        当然可能会有数据下界溢出的情况 */    if(bignuma+bignumb > 10000000000 )        printf("success\n");#ifndef INT_MAX#define INT_MAX 999999999#endif    printf("INT_MAX: %d\n",INT_MAX);// if(unsigned(bignuma) + unsigned(bignumb) > )//  printf("%d \n",bignuma);//testFun();//testFun2();    Func();}double Func(){    double t=10.000;    return t;}


原创粉丝点击