#include <stdio.h>
#include <stdlib.h>

char token;   //全局变量,用于存放需要处理的数字或者符号
int low();
int mid();
int high();


void match(const char expectedtoken)    //匹配函数 expectedtoken的意思是计算匹配,如果满足说明算式正常
{
	if(token == expectedtoken) token = getchar();  //如果匹配成功则读取下一个字符
	else 
	{
		printf("cannot match\n");  //如果匹配不成功就提示并退出程序    
		getchar();    
		exit(1);
	}
}

int low(void)   //进行加减运算的函数
{
	int result = mid();//  这里为的是读取第一个数字 而不是为了其他什么
	while((token == '+') || (token == '-'))   //进入加减的循环
		if(token == '+')
		{
			match('+');
			result += mid();
		}
		else if(token == '-')
		{
			match('-');
			result -= mid();
		}
		return result;
}

int mid()   //乘除运算
{
	int div;
	int result = high();//直接返回数字 或者计算括号里面的
	//再次进入乘除循环
	while((token == '*') || (token == '/'))
		if(token == '*')
		{
			match('*');
			result *= high();
		}
		else if(token == '/')
		{
			match('/');
			div = high();  //取得除数   
			if(div == 0)
			{
				printf("被除数为0没有意义成将退出!\n");
				getchar();
				exit(1);
			}
			
			result /= div;
		}
		return result;
}

int high()
{
	int result;
	if(token == '(')
	{
		match('(');
		result = low();
		match(')');
	}
	else if(token >= '0' && token <= '9')
	{
		ungetc(token,stdin);  
		scanf("%d",&result);
		token = getchar();
	}
	else 
	{
		printf("high 出现未识别的字符 程序将退出!\n");
		system("pause");
		exit(1);
	}
	return result;
}

int main()
{
	token = getchar();
	int result = low();
	printf("This answer is:%d",result);
	getchar();
	return 0;
}

递归下降法-从最复杂的部分开始,逐步细化,直到表达式可以计算为止。

这种递归算法的思想用于分析和解决复杂的问题非常有效


1.exit(int) 所在头文件为stdlib   参数0 为正常返回 其他数字为异常返回 供其他程序调用

2.C语言允许 全局函数 未声明就可以调用  而在C++里面 全局函数被调用时 在前面可以不用声明 若是在后面必须声明 否则编译器会报错

3.getchar() 函数读取时,如果读取的目标是数字。则只会读取数组部分,非数字部分依旧保留在键盘输入的缓冲区内,可以等待下次读取。

4.不知道是语法变了还是怎么回事,break在程序里面是个累赘。break对if语句无效,并且break对离得最近的一个while或者for switch语句有效。


5.双引号和单引号的区别

含义不同:单引号中的字符实际上代表一个整数。对应是其ASCII字符的值 s的含义和数字115一样

而用双引号引起的字符串,代表的一个指向无名数组起始地址的指针


大小不同:单引号里面的字符大小就是一个字节

而双引号引起字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符'\0'来表示结束。


函数吸收:

exit(int) stdlib.h 参数设置0为正常退出 设置为其他数字为异常退出。参数会传递给操作系统,UNIX,Linux,MS DOS供其他程序调用。

int getchar(void) stdio.h 相当于getc(stdin)从标准输出力读取下一个字符,返回读取字符的ASCII码。

int scanf(const char* format,....) 标准输入设备,一般输键盘中读内容通用的子程序,可以说明的格式多个字符。scanf读取数字是遇到非数字字符,不会读取,字符继续保留在缓冲区内等待下一次读取。

int ungetc(int c,FILE *stream) 把字符退回到输入流中,可以理解成一个计数器