比较杂乱的记录的一些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;
}