您的位置:

很酷的c语言,有意思的C语言

本文目录一览:

超酷的C语言

C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了。

一、指定的初始化

很多人都知道像这样来静态地初始化数组:

C99标准实际上支持一种更为直观简单的方式来初始化各种不同的集合类数据(如:结构体,联合体和数组)。

二、数组

我们可以指定数组的元素来进行初始化。这非常有用,特别是当我们需要根据一组#define来保持某种映射关系的同步更新时。来看看一组错误码的定义,如:

现在,假设我们想为每个错误码提供一个错误描述的字符串。为了确保数组保持了最新的定义,无论头文件做了任何修改或增补,我们都可以用这个数组指定的语法。

这样就可以静态分配足够的空间,且保证最大的索引是合法的,同时将特殊的索引初始化为指定的值,并将剩下的索引初始化为0。

三、结构体与联合体

用结构体与联合体的字段名称来初始化数据是非常有用的。假设我们定义:

然后我们这样初始化struct point:

当我们不想将所有字段都初始化为0时,这种作法可以很容易的在编译时就生成结构体,而不需要专门调用一个初始化函数。

对联合体来说,我们可以使用相同的办法,只是我们只用初始化一个字段。

四、宏列表

C中的一个惯用方法,是说有一个已命名的实体列表,需要为它们中的每一个建立函数,将它们中的每一个初始化,并在不同的代码模块中扩展它们的名字。这在Mozilla的源码中经常用到,我就是在那时学到这个技巧的。例如,在我去年夏天工作的那个项目中,我们有一个针对每个命令进行标记的宏列表。其工 作方式如下:

它定义了一个FLAG_LIST宏,这个宏有一个参数称之为 _ ,这个参数本身是一个宏,它能够调用列表中的每个参数。举一个实际使用的例子可能更能直观地说明问题。假设我们定义了一个宏DEFINE_FLAG,如:

对FLAG_LIST(DEFINE_FLAG)做扩展能够得到如下代码:

接着,对每个参数都扩展DEFINE_FLAG宏,这样我们就得到了enum如下:

接着,我们可能要定义一些访问函数,这样才能更好的使用flag列表:

一步步的展示其过程是非常有启发性的,如果对它的使用还有不解,可以花一些时间在gcc –E上。

五、编译时断言

这其实是使用C语言的宏来实现的非常有“创意”的一个功能。有些时候,特别是在进行内核编程时,在编译时就能够进行条件检查的断言,而不是在运行时进行,这非常有用。不幸的是, C99标准还不支持任何编译时的断言。

但是,我们可以利用预处理来生成代码,这些代码只有在某些条件成立时才会通过编译(最好是那种不做实际功能的命令)。有各种各样不同的方式都可以做到这一点,通常都是建立一个大小为负的数组或结构体。最常用的方式如下:

如果(condition)计算结果为一个非零值(即C中的真值),即! (condition)为零值,那么代码将能顺利地编译,并生成一个大小为零的结构体。如果(condition)结果为0(在C真为假),那么在试图生成一个负大小的结构体时,就会产生编译错误。

它的使用非常简单,如果任何某假设条件能够静态地检查,那么它就可以在编译时断言。例如,在上面提到的标志列表中,标志集合的类型为uint32_t,所以,我们可以做以下断言:

它扩展为:

现在,假设Total=32。那么-!(Total = 32)等于0,所以这行代码相当于:

这是一个合法的C代码。现在假设标志不止32个,那么-!(Total = 32)等于-1,所以这时代码就相当于:

因为位宽为负,所以可以确定,如果标志的数量超过了我们指派的空间,那么编译将会失败。

C语言程序。

#include "stdio.h"

int main()

{int c;

 scanf("%d",c);

 switch(c)

 {

  case 1:printf("我很酷\n");break;

  case 2:printf("我是超级赛亚人\n");break;

  case 3:printf("我是最棒的\n");break;

  case 4:printf("我们都是善良的好孩子\n");break;

  default:printf("Error\n");

 }

 return 0;

}

用C语言如何编写推箱子,给个思路呗

#includestdio.h

#include conio.h

#include windows.h

#define R 2//小人

#define B 4//箱子

#define O 3//目的地

#define W 43//墙

#define RO 5//箱子与人重合

#define BO 6//箱子与目的地重合

#define Size 13//数组大小

int main ()

{

printf ("推箱子(1~10关):\nwasd或↑↓←→控制方向。n下一关。r重新开始。\n请注意输入法是否为小写英文输入\n");

system ("pause");

MessageBox (NULL,"第一关"," ",MB_OK);//第一关

int move (char a[Size][Size]);

char a[Size][Size]={0};

int i,j;

void all0 (char a[Size][Size]);

NO1:

all0 (a);

for (i=3;i6;i++)

a[0][i]=W;

a[1][3]=W;

a[1][5]=W;

for (i=0;i4;i++)

a[2][i]=W;

a[2][5]=W;

a[3][0]=W;

for (i=0;i3;i++)

a[4][i]=W;

a[4][7]=W;

for (i=5;i8;i++)

{

a[3][i]=W;

a[i][2]=W;

a[i][4]=W;

a[5][i]=W;

}

a[7][3]=W;

a[1][4]=O;

a[3][1]=O;

a[4][6]=O;

a[6][3]=O;

a[3][2]=B;

a[3][4]=B;

a[4][4]=B;

a[5][3]=B;

a[4][3]=R;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO1;

MessageBox (NULL,"第二关"," ",MB_OK);//第二关

NO2:

all0 (a);

for (i=0;i5;i++)

{

a[i][0]=W;

a[0][i]=W;

a[i][4]=W;

}

a[5][2]=W;

a[4][2]=W;

for (i=4;i9;i++)

a[i][1]=W;

for (i=2;i6;i++)

a[8][i]=W;

a[6][5]=W;

for (i=5;i9;i++)

a[7][i]=W;

for (i=2;i8;i++)

a[i][8]=W;

a[2][7]=W;

for (i=2;i5;i++)

a[i][6]=W;

a[4][5]=W;

a[1][1]=R;

a[2][2]=B;

a[2][3]=B;

a[3][2]=B;

a[3][7]=O;

a[4][7]=O;

a[5][7]=O;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO2;

MessageBox (NULL,"第三关"," ",MB_OK);//第三关

NO3:

all0 (a);

for (i=1;i8;i++)

a[0][i]=W;

a[1][1]=W;

for (i=7;i10;i++)

a[1][i]=W;

for (i=0;i2;i++)

a[2][i]=W;

for (i=3;i6;i++)

a[2][i]=W;

a[2][9]=W;

a[3][0]=W;

a[3][9]=W;

a[4][0]=W;

a[4][4]=W;

a[4][9]=W;

a[4][8]=W;

a[5][0]=W;

a[5][1]=W;

a[5][4]=W;

a[5][8]=W;

for (i=1;i9;i++)

a[6][i]=W;

a[2][2]=B;

a[3][4]=B;

a[3][2]=R;

a[3][7]=B;

a[4][6]=B;

a[4][2]=O;

a[4][3]=O;

a[5][2]=O;

a[5][3]=O;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO3;

MessageBox (NULL,"第四关"," ",MB_OK);//第四关

NO4:

all0 (a);

for (i=1;i5;i++)

{a[0][i]=W;a[7][i]=W;}

a[1][1]=W;

a[1][4]=W;

a[2][1]=R;

a[2][2]=B;

a[2][4]=W;

a[3][1]=W;

a[3][2]=B;

a[3][4]=W;

a[3][5]=W;

a[4][1]=W;

for (i=1;i8;i++)

a[i][0]=W;

a[4][3]=B;

a[5][2]=B;

a[5][1]=O;

a[6][1]=O;

a[6][2]=O;

a[6][3]=BO;

a[6][4]=O;

for (i=1;i4;i++)

a[i][4]=W;

for (i=3;i8;i++)

a[i][5]=W;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO4;

MessageBox (NULL,"第五关"," ",MB_OK);//第五关

NO5:

all0 (a);

for (i=1;i6;i++)

a[0][i]=W;

for (i=1;i4;i++)

a[i][1]=W;

for (i=3;i8;i++)

a[i][0]=W;

for (i=1;i8;i++)

a[7][i]=W;

for (i=4;i7;i++)

{a[1][i]=W;a[i][1]=O;}

for (i=3;i7;i++)

a[i][7]=W;

a[2][6]=W;

a[3][6]=W;

a[1][2]=R;

a[2][3]=B;

a[3][2]=W;

a[4][2]=W;

a[3][4]=W;

a[4][4]=W;

a[5][5]=W;

a[5][2]=B;

a[6][5]=B;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO5;

MessageBox (NULL,"第六关"," ",MB_OK);//第六关

NO6:

all0 (a);

for (i=1;i8;i++)

a[i][0]=W;

for (i=7;i11;i++)

a[i][1]=W;

for (i=1;i4;i++)

{a[1][i]=W;a[i][9]=W;}

for (i=3;i10;i++)

a[0][i]=W;

for (i=3;i8;i++)

a[i][10]=W;

for (i=7;i11;i++)

a[i][12]=W;

a[7][11]=W;

for (i=2;i13;i++)

a[10][i]=W;

for (i=3;i6;i++)

{a[i][2]=W;a[8][i]=W;}

for (i=5;i8;i++)

{a[2][i]=W;a[i][8]=W;}

a[3][4]=W;

a[6][3]=W;

a[4][7]=W;

a[7][6]=W;

a[9][8]=W;

a[9][7]=W;

a[2][4]=O;

a[6][2]=O;

a[4][8]=O;

a[8][6]=O;

a[4][4]=B;

a[4][6]=B;

a[5][5]=BO;

a[6][4]=B;

a[6][6]=B;

a[8][11]=R;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO6;

MessageBox (NULL,"第七关"," ",MB_OK);//第七关

NO7:

all0 (a);

for (i=3;i10;i++)

a[0][i]=W;

for (i=1;i6;i++)

a[i][2]=W;

for (i=5;i8;i++)

a[i][0]=W;

a[5][1]=W;

a[1][3]=W;

a[6][0]=W;

for (i=0;i9;i++)

a[7][i]=W;

a[5][8]=W;

a[6][8]=W;

for (i=1;i6;i++)

a[i][9]=W;

a[1][6]=W;

a[2][6]=W;

a[4][5]=W;

a[4][6]=W;

a[5][6]=W;

a[3][3]=B;

a[3][5]=B;

a[3][7]=B;

a[4][4]=B;

a[5][4]=B;

a[1][8]=R;

for (i=1;i6;i++)

a[6][i]=O;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO7;

MessageBox (NULL,"第八关"," ",MB_OK);//第八关

NO8:

all0 (a);

for (i=3;i9;i++)

a[0][i]=W;

for (i=1;i4;i++)

a[1][i]=W;

a[2][1]=W;

a[1][8]=W;

a[2][8]=W;

for (i=2;i6;i++)

a[i][0]=W;

for (i=1;i6;i++)

a[5][i]=W;

for (i=2;i5;i++)

a[i][9]=W;

for (i=4;i7;i++)

a[i][8]=W;

for (i=5;i9;i++)

a[6][i]=W;

a[2][5]=W;

a[2][6]=W;

a[2][4]=B;

a[3][3]=B;

a[3][5]=B;

a[4][4]=B;

a[4][6]=B;

a[3][8]=R;

a[3][1]=O;

a[4][1]=O;

for (i=2;i5;i++)

a[i][2]=O;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO8;

MessageBox (NULL,"第九关"," ",MB_OK);//第九关

NO9:

all0 (a);

for (i=1;i10;i++)

{a[0][i]=W;a[8][i]=W;}

for (i=1;i6;i++)

{a[i][1]=W;a[i][9]=W;}

for (i=5;i9;i++)

{a[i][0]=W;a[i][10]=W;}

for (i=4;i7;i++)

{a[3][i]=W;a[4][i]=O;a[5][i]=O;}

a[1][4]=W;

a[1][5]=W;

a[4][3]=W;

a[5][3]=W;

a[4][7]=W;

a[5][7]=W;

a[7][6]=W;

a[2][5]=B;

a[3][2]=B;

a[3][8]=B;

a[6][2]=B;

a[6][5]=B;

a[6][8]=B;

a[7][8]=R;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO9;

MessageBox (NULL,"第十关"," ",MB_OK);//第十关

NO10:

all0 (a);

for (i=2;i8;i++)

a[0][i]=W;

a[1][2]=W;

for (i=0;i2;i++)

a[2][i]=W;

for (i=3;i6;i++)

a[i][0]=W;

for (i=1;i4;i++)

a[5][i]=W;

for (i=3;i7;i++)

a[6][i]=W;

for (i=1;i5;i++)

a[i][7]=W;

a[4][6]=W;

a[5][6]=W;

a[3][1]=R;

for (i=3;i6;i++)

{a[2][i]=B;a[4][i]=O;}

a[3][3]=B;

a[3][4]=O;

a[3][5]=O;

a[4][2]=B;

if (move (a))

{

printf ("WIN\n");

system ("pause");

}

else

goto NO10;

MessageBox(NULL,"恭喜您通关了。"," ",MB_OK);

return 0;

}

int move (char a[Size][Size])//控制小人的移动

{

int condition (char a [Size][Size],int x,int y,int b,int c,int d,int e);

void print ( char a [Size][Size]);

int x,y;

char c;

int i,j;

for (i=0;iSize;i++)//给小人定位

for (j=0;jSize;j++)

if (a[i][j]==R)

{ x=i;y=j; }

print (a);

loop:

c=getch();

if (c==0)//如果是键盘上下左右键用扫描码

c=getch();

switch(c)

{

case 'n':

case 'N': return 1;//下一关

case 'r':

case 'R': return 0;//返回0,重新开始

case 'w':

case 'W':

case  72: if (condition(a,x,y,x-1,y,x-2,y))x=x-1;break;//上

case 'a':

case 'A':

case  75: if (condition(a,x,y,x,y-1,x,y-2))y=y-1;break;//下

case 's':

case 'S':

case  80: if (condition(a,x,y,x+1,y,x+2,y))x=x+1;break;//左

case 'd':

case 'D':

case  77: if (condition(a,x,y,x,y+1,x,y+2))y=y+1;break;//右

default : goto loop;

}

print (a);

for (i=0;iSize;i++)//用是否存在箱子作胜利条件

for (j=0;jSize;j++)

if (a[i][j]==B)

goto loop;

return 1;

}

void print ( char a [Size][Size])//输出数组函数

{

int i,j;

system ("cls");//清屏函数

for (i=0;iSize;i++)

{

for (j=0;jSize;j++)

if (a[i][j]!=0)

printf ("%2c",a[i][j]);

else

printf ("  ");

printf ("\n");

}

printf ("\n");

}

int condition (char a [Size][Size],int x,int y,int b,int c,int d,int e)//小人移动后的情况处理

{

if (a[b][c]!=W)

{

if (a[x][y]==Ra[b][c]==0)

{a[x][y]=0;a[b][c]=R;return 1;}

if (a[x][y]==ROa[b][c]==0)

{a[x][y]=O;a[b][c]=R;return 1;}

if ((a[x][y]==R||a[x][y]==RO)(a[b][c]==B||a[b][c]==BO)(a[d][e]==B||a[d][e]==BO||a[d][e]==W))

return 0;

if (a[x][y]==Ra[b][c]==O)

{a[x][y]=0;a[b][c]=RO;return 1;}

if (a[x][y]==ROa[b][c]==O)

{a[x][y]=O;a[b][c]=RO;return 1;}

if (a[x][y]==Ra[b][c]==Ba[d][e]==O)

{a[x][y]=0;a[b][c]=R;a[d][e]=BO;return 1;}

if (a[x][y]==Ra[b][c]==Ba[d][e]==0)

{a[x][y]=0;a[b][c]=R;a[d][e]=B;return 1;}

if (a[x][y]==Ra[b][c]==BOa[d][e]==0)

{a[x][y]=0;a[b][c]=RO;a[d][e]=B;return 1;}

if (a[x][y]==Ra[b][c]==BOa[d][e]==O)

{a[x][y]=0;a[b][c]=RO;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==Ba[d][e]==O)

{a[x][y]=O;a[b][c]=R;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==Ba[d][e]==0)

{a[x][y]=O;a[b][c]=R;a[d][e]=B;return 1;}

if (a[x][y]==ROa[b][c]==BOa[d][e]==O)

{a[x][y]=O;a[b][c]=RO;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==BOa[d][e]==0)

{a[x][y]=O;a[b][c]=RO;a[d][e]=B;return 1;}

}

return 0;

}

void all0 (char a[Size][Size])//数组成员归为0

{

int i,j;

for (i=0;iSize;i++)

for (j=0;jSize;j++)

a[i][j]=0;

}