三子棋代码 显示未申明标识符,可是明明定义了呀
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define col 3
void menu()
{
printf("*******************\n");
printf("**1.paly 0.exit**\n");
printf("*******************\n");
}
void game()
{
char arr[row][col]={0};/*空格填充*/
srand((int)time(NULL));
int i=0;
int j=0;
int a=0;
int b=0;
int m=0;
int n=0;
int t=0;
/*打印棋盘*/
for(i=0;i<row;i++)
{
/*打印一行内容*/
for(j=0;j<col;j++)
{
printf(" %c ",arr[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)/*最后一行不需---|*/
{
/*打印第二行内容*/
for(j=0;j<col;j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
while(1)
{
/*玩家输入坐标*/
while(1)
{
printf("请输入坐标:");
scanf("%d%d",&a,&b);
if((a>0&&a<=row)&&(b>0&&b<=col)&&(arr[a-1][b-1]==' '))
{
arr[a-1][b-1]='*';
break;
}
}
/*判断输赢*/
for(m=0;m<row;m++)
{
if((arr[m][0]==arr[m][1]==arr[m][2])&&arr[m][0]!=' ')
t=arr[m][0];
}
for(m=0;m<row;m++)
{
if((arr[0][m]==arr[1][m]==arr[2][m])&&arr[0][m]!=' ')
t=arr[0][m];
}
if((arr[0][0]==arr[1][1]==arr[2][2])&&arr[0][0]!=' ')
t=arr[m][0];
if((arr[0][2]==arr[1][1]==arr[2][0])&&arr[0][0]!=' ')
t=arr[0][2];
for(m=0;m<row;m++)
{
for(n=0;n<col;n++)
{
if(arr[m][n]!=' ')
{
t=1;
}
}
}
if(t=='*')
{
printf("恭喜你赢啦");
break;
}
else if(t=='#')
{
printf("输了");
break;
}
else if(t==1)
{
printf("平局");
break;
}
/*电脑输入坐标*/
while(1)
{
printf("电脑输入坐标:");
a=rand()%row;
b=rand()%col;
if(arr[a][b]==' ')
{
arr[a][b]='#';
printf("%c",arr[a][b]);
break;
}
}
/* 判断输赢*/
for(m=0;m<row;m++)
{
if((arr[m][0]==arr[m][1]==arr[m][2])&&arr[m][0]!=' ')
t=arr[m][0];
}
for(m=0;m<row;m++)
{
if((arr[0][m]==arr[1][m]==arr[2][m])&&arr[0][m]!=' ')
t=arr[0][m];
}
if((arr[0][0]==arr[1][1]==arr[2][2])&&arr[0][0]!=' ')
t=arr[m][0];
if((arr[0][2]==arr[1][1]==arr[2][0])&&arr[0][0]!=' ')
t=arr[0][2];
for(m=0;m<row;m++)
{
for(n=0;n<col;n++)
{
if(arr[m][n]!=' ')
{
t=1;
}
}
}
if(t=='*')
{
printf("恭喜你赢啦");
break;
}
else if(t=='#')
{
printf("输了");
break;
}
else if(t==1)
{
printf("平局");
break;
}
}
}
int main()
{
int input=0;
menu();
printf("请输入(1/0):");
do
{
scanf("%d",&input);
switch(input)
{
case 1:game();
break;
case 0:printf("退出游戏");
break;
default:printf("请重新输入:");
break;
}
}while(input);
}
为啥在我的编译器里,就不报错呢?
代码1:(*(void (*)())0)();
代码2:void (*signal(int , void(*)(int)))(int);
代码分析:
在读代码时,代码2可谓是相当复杂,为了增加代码的可读性,我们可以使用typedfy-类型重定义关键字对其进行简化:
int main()
{
void(*signal(int, void(*)(int)))(int);
typedef void(*pf_t)(int) ;//语法规定pf_t在*后边
pf_t signal( int, pf_t);
//////////////////////////////注释////////////////////////////
//上述代码是一次函数声明
//声明的函数叫:signal
//signal函数的第一个参数是int类型的
//signal函数的第二个参数是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
//signal函数的返回类型也是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
//void (*)(int) signal(int, void(*)(int)); //err
return 0;
}
📖总结:像上面这样的表达式恐怕会令我们“不寒而粟”。然而我们大可不必对此望而生畏,我们只需要对其进行拆解,就能对其很好地理解。