精华内容
下载资源
问答
  • C语言表达式求值

    2013-06-20 19:40:38
    C语言表达式求值 复制源码到相应编译器即可运行。
  • 数据结果,C语言表达式求值,堆栈经典应用。输入表达式,如1+2*3,输出运算后的值。
  • c语言表达式求值

    2019-07-27 10:48:36
    int a=2; printf("%d\n", a=a+++1); int a=2; printf("%d\n", a=++a+1); int a=2; printf("%d\n", a=(a++)+1); 三段代码分别输出,3,4,3 为什么?
  • 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值。讨论了逗号操作符,、逻辑与操作符&&、逻辑或操作符||和条件操作符?:的问号处需要序列点的原因。举例分析了序列点...
  • C语言表达式求值.docx

    2020-12-23 00:26:19
    实验四 算术表达式求值运算器 一实验目的 帮助学生熟练掌握栈的基本操作 并通过用算符优先法对表达式求值的过程深刻领会用 栈解决实际问题的基本方法 二实验内容 编写程序实现从键盘终端输入语法正确的算术表达式...
  • /* 表达式求值输入一个表达式如 1+2*3#程序可计算出结果为 7 支持以下符号 + - * / ( ) ^ . 可以计算整数小数 其中^表示次方2^5 表示 2 的 5 次方 */ /*头文件*/ #include <stdio.h> #include <malloc.h> #include ...
  • 说明 本程序支持括号以及小数计算 ...表达式求值可以借鉴该博文 我的代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define maxsize 100 #define N 7 typedef struct{/...

    说明

    本程序支持括号以及小数计算


    基本思想

    先将中缀表达式转换为后缀表达式,再求值
    中缀转后缀可以借鉴该博文
    表达式求值可以借鉴该博文


    我的代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define maxsize 100
    #define N 7
    typedef struct{//运算符栈
    	char data[maxsize];
    	int top;
    }seqOperate;
    
    typedef struct{//运算数栈
    	double data[maxsize];
    	int top;
    }seqData;
    
    char operators[maxsize] = { '+', '-', '*', '/','=','(',')'};
    
    int priotiry(char ch){//运算符优先级
    	switch(ch){
    	case '+':
    		return 1;
    	case '-':
    		return 1;
    	case '*':
    		return 2;
    	case '/':
    		return 2;
    	case '(':
    		return 0;
    	case ')':
    		return 0;
    	default:return -1;
    	}
    }
    //判断运算符栈是否为空
    int isEmptyOp(seqOperate *s1){
    	if(s1->top == -1)
    		return 1;
    	else
    		return 0;
    }
    
    //从运算符栈中弹出一个运算符
    char popo(seqOperate *s1){
    	if(!isEmptyOp(s1)){
    		char ch=s1->data[s1->top];
    		s1->top--;
    		return ch;
    	}
    	else
    		return 'F';
    }
    //运算符入栈
    void pusho(seqOperate *s1,char ch){
    	s1->top++;
    	s1->data[s1->top]=ch;
    }
    //获取栈顶元素
    char getTopo(seqOperate *s1){
    	return s1->data[s1->top];
    }
    //初始化运算符栈
    void initSeqOperate(seqOperate *s1){
    	//s1=(seqOperate*)malloc(sizeof(seqOperate));
    	s1->top=-1;
    }
    //初始化运算数栈
    void initSeqData(seqData *s2){
    	s2->top=-1;
    }
    //运算数入栈
    void pushd(seqData *s2,double d){
    	s2->top++;
    	s2->data[s2->top]=d;
    }
    double popd(seqData *s2){
    	double d;
    	d=s2->data[s2->top];
    	s2->top--;
    	return d;
    }
    //判断所给字符是否为运算符
    int isOperate(char ch){
    	int i;
    	for (i = 0; i < N; i++)
    	{
    		if (operators[i] == ch)
    		{
    			return 1;
    		}
    	}
    	return 0;
    }
    char * infixToAffix(char *str){
    	seqOperate *s1;
    	int i=0,j=0;
    	char ch;
    	static char result[maxsize];
    	s1=(seqOperate*)malloc(sizeof(seqOperate));//在codeblocks和vc++6.0上都需要这一句,dev-c++上不需要,请视情况而定
    //	char result[maxsize];
    	initSeqOperate(s1);
    	while(str[i]!='\0'){
    		if(str[i]=='.'||(str[i]<='9'&&str[i]>='0')){
    			result[j++]=str[i];
    		}
    		else{
    			result[j++]='#';//将数字字符串和操作符分开--转换时定界的功能
    			if(str[i]=='+'||str[i]=='-'){
    				if(isEmptyOp(s1)){
    					pusho(s1,str[i]);
    				}
    				else{
    					while(getTopo(s1)!='('&&!isEmptyOp(s1)){
    						ch=popo(s1);
    						result[j++]=ch;
    					}
    					pusho(s1,str[i]);
    				}
    			}
    			else if(str[i]==')'){
    				ch=popo(s1);
    				while(ch!='('){
    					result[j++]=ch;
    					ch=popo(s1);
    				}
    			}
    			else if(str[i]=='*'||str[i]=='/'||str[i]=='('){
    				pusho(s1,str[i]);
    			}
    		}
    		i++;
    	}
    	while(!isEmptyOp(s1)){
    		ch=popo(s1);
    		result[j++]=ch;
    	}
    //	printf("-------\n");
    //	printf("%s\n",result);
    	return result;
    }
    double getAffixValue(char *res){
    	seqData *s2;
    	double sum,t,a,b,result;
    	int i=0;
    	s2=(seqData *)malloc(sizeof(seqData));
    	initSeqData(s2);
    	while(res[i]!='\0'){
    		if(res[i]<='9'&&res[i]>='0'){
    			sum=0;
    			t=10;
    			sum=res[i]-'0';
    			i++;
    			while((res[i]<='9'&&res[i]>='0')||res[i]=='.'){//字符串转double
    				if(res[i]!='.'){
    					if( t == 10)
    						sum = sum * t + res[i] - 48;
    					else
    					{
    						sum += ( res[i] - 48 ) * t;
    						t = t*0.1;
    					}
    				}
    				else{
    					t=0.1;
    				}
    				i++;
    			}
    		//	printf("%lf %d\n",sum,i);
    			pushd(s2,sum);
    
    		}
    		if(res[i]=='+'||res[i]=='-'||res[i]=='*'||res[i]=='/'){
    			a=popd(s2);
    			b=popd(s2);
    			if(res[i]=='+')
    				pushd(s2,b+a);
    			if(res[i]=='-')
    				pushd(s2,b-a);
    			if(res[i]=='*')
    				pushd(s2,b*a);
    			if(res[i]=='/')
    				pushd(s2,b/a);
    		}
    		i++;
    
    	}
    	result=popd(s2);
    	//printf("最终结果为:%lf",result);
    	return result;
    }
    int main(){
    	int n,m;
    	char * res;
    	char str[maxsize];
    	double result;
    	scanf("%d",&n);
    	while(n--){
    		scanf("%s",str);
    		res = infixToAffix(str);
    		//printf("result%s\n",res);
    		result=getAffixValue(res);
    		m=(int)result;
    		if(result-m==0)
    			printf("%d\n",m);
    		else
    			printf("%.2lf\n",result);
    	}
    }
    

    ps:欢迎评论指正

    展开全文
  • 如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号...

    C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:

    3+5,6+8

    称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为

    表达式1,表达式2

    逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式

    a=3*5,a*4

    对此表达式的求解,读者可能会有两种不同的理解:

    一种认为“3*5,a*4”是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a,因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a*4”是另一个表达式,二者用逗号相连,构成一个逗号表达式。

    这两者哪一个对呢?赋值运算符的优先级别高于逗号运算符,因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。

    一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。

    d4b0007e7a8304e14aae1fedbd3d4795.png

    逗号表达式的一般形式可以扩展为

        表达式1,表达式2,表达式3……表达式n

    它的值为表达式n的值。

      逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的:

      ① x=(a=3,6*3)

      ② x=a=3,6*a

      第①个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第②个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。

      其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中.

    a0fe1f4ce1c465df22a427328d515759.png

     请注意并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如

    printf("%d,%d,%d",a,b,c);

      上一行中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。

    如果改写为

    printf("%d,%d,%d",(a,b,c),b,c);

    则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。

    C语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而c使用灵活,适应性强。

    希望以上分享对你有所帮助jq.qq.com
    展开全文
  • 表达式可以嵌套,每个表达式都有一个。在计算时要考虑运算符的优先级、结合性及数据类型的转换;计算机中的表达式都写在一行中。表达式有算术、赋值、关系、逻辑、条件和逗号等。在表达式的后边加个分号就是表达式...

    895d06b3752d3d1e45820460ac33635a.png

    表达式是由运算符(包括括号)、操作数(常量、变量、函数等,是一个操作符操作于其上的数)按照一定的规则组成的式子;可以将常量、变量和函数认为是最简单的表达式。表达式可以嵌套,每个表达式都有一个值。在计算时要考虑运算符的优先级、结合性及数据类型的转换;计算机中的表达式都写在一行中。表达式有算术、赋值、关系、逻辑、条件和逗号等。在表达式的后边加个分号就是表达式语句。除了控制语句外,几乎都是表达式语句。如:
    算术表达式:用于算术计算;
    赋值表达式:右值赋值给左值;
    关系表达式:表达一些比较简单的关系;
    逻辑表达式:表达一些比较复杂的关系,一般使用逻辑运算符来连接关系表达式;
    条件表达式:"?:"表达式,if else语句的简单表达。
    常见操作符及使用:

    27fce78fbf82081345944dc0cf55bfb2.png

    1 操作符的优先级、结合性

    C语言的数据类型是指对数据按某种规则所进行的分类。运算符是说明特定操作的符号,是构造表达式的工具。

    要理解由多个操作符组成的表达式,必须先理解操作符的优先级、结合性,理解操作数的求值顺序。

    运算符的结合性与优先级:如自增自减、赋值运算符,是从右到左;算术运算符、关系运算符,是从左到右。

    结合性规定了具有相同优先级的操作符如何分组。我们已经遇到过涉及结合性的例子。其中之一使用了赋值操作的右结合性,这个特性允许将多个赋值操作串接起来:

    4e47a88bce7725c4156e29b7ba1d4e85.png
    ival = jval = kval = lval // right associative,starting from right
    (ival = (jval = (kval = lval))) // equivalent, parenthesized version
    

    该表达式首先将 lval 赋给 kval ,然后将 kval 的值赋给 jval ,最后将 jval 的值再赋给 ival。

    另一方面,算术操作符为左结合。表达式

    ival 

    先对 ival 和 jval 做乘法操作,然后乘积除以 kval,最后再将其商与 lval 相乘。

    一元操作符和含等号=(赋值操作)的运算符大都是右结合操作符,除此以外,都是左结合(从左至右)。2 逻辑表达式的短路求值

    int i=6;
    int j=1;
    if(i>0 || (j++)>0)
    j+=5;
    

    j++的计算会被忽略,对于||,如果左边的条件表达式为真,右边的条件表达式不管是真还是假,整个表达式都是真,这也就是短路求值,只有在左边条件表达式不确定整个逻辑表达式的结果时,才会计算右边的条件表达式,这在一定程度上增加了效率,但也可能带来了一些无法预料的错误。当用||连接两个条件表达式时,适合将可能性小的表达式放在左边先计算。

    if(i<0 && (j++)>0)
    j+=5;
    

    j++的计算会被忽略,对于&&,如果一个为假,其他不管是真还是假,整个表达式是假,适合将可能性大的表达式放在左边先计算;

    3 表达式中的自动类型转换

    整型与整型数运算,结果为整型,如 5 / 2 = 2 
    整型与浮点数运算,结果为浮点数,如5 / 2.0 = 2.5 
    字符与整型数运算,结果为整型。
    字符与浮点数运算,结果为浮点数。
    浮点数与浮点数运算,结果为浮点数。
    

    4 逻辑表达式

    使用关系运算符不能够清晰地描述更为复杂的逻辑关系,因为一个复杂的逻辑通常会包含多个小的逻辑关系。

    如果我们的逻辑更为复杂,有多个逻辑条件,则代码中需要多个嵌套的if语句。为了使用计算机语言简化逻辑关系的描述,计算机语言的专家们提出了逻辑运算符的概念。逻辑运算符主要是实现了人类语言中并且、或者等连词在计算机中的表示。使用逻辑运算符可以连接关系表达式以构成复杂的逻辑表达式。C++中共有3种逻辑运算符,分别为“&&”、“||”和“!”。其中“&&”表示逻辑与运算符,也就是“并且”的含义,当两个表达式同时为真,其结果为真,否则为假。“||”表示逻辑或运算符,即“或者”的含义,当两个表达式中有一个表达式为真,结果为真,否则为假。“!”表示逻辑或运算符,即当表达式的值为真,结果为假,当表达式的值为假,其结果为真。

    构成逻辑表达式的运算符有关系运算符(&&、||、!)和逻辑运算符(>、>=、<、<=、==、!=等),单独的关系运算符构成的关系表达式是简单的逻辑表达式,逻辑运算符用于连接关系表达式,可以构成复杂的逻辑表达式。C语言逻辑运算的结果是:真与假(1与0)。

    5 空语句

    表达式以分号“;“结尾,单独的一个分号可以构成一条空语句:

    while((*pdst++=*psrc++)!='0')
    ;
    

    当在一个控制结构的条件或逻辑表达式中完成了所需要的操作时,可以使用空语句(同时,控制结构也要求有语句体)。

    空语句要避免以下错误;

    while((*pdst++=*psrc++)!='0'); //不小心加的分号
    {//以下块语句的执行并不是按上述的条件表达式的判断来执行的,而是顺序执行一次
    //……
    }
    

    6 逗号表达式

    逗号表达式是一组由逗号分隔的表达式,逗号表达式从左向右计算。逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。此类表达式通常用于for循环,用于初始或更新多个用于条件判断的变量。

    逗号表达式,从左往右计算,结果是最右边表达式的值,如:

    y=(x=2,x+=8,x+12),x+x;
    

    结果是:x=10, y = 20

    7 表达式计算的内部实现

    根据运算符在表达式中的位置,一般有三种表示方法:中序法(我们日常一般的写法),前序法,后序法(运算符在操作数和前面)。对于中序法因为运算符的优先级问题,计算机在处理上较为复杂,所以一般会将中序法转化为前序或后序法。后序法只需要一个堆栈缓存器(前序法需要两个)。

    转换的方式有:括号转换法(先用括号把中序法表达式的运算符优先级分出来,再进行运算符的移动。)、堆栈法;

    展开全文
  • C语言表达式求值顺序

    2013-12-22 22:24:57
    一个C语言程序jiajia.c如下:  [code=c]#include int main() {  long i;  i=0;  printf("%ld\n",(++i)+(++i)+(++i));  }[/code] 该程序在X86、linux机器上编译后的运行结果为7,而在SPARC/SUNOS机器上编译后...
    一个C语言程序jiajia.c如下: 
    #include<stdio.h>
    	int main()
    	{ 
    		long i; 
    		i=0; 
    		printf("%ld\n",(++i)+(++i)+(++i)); 
    	}
    该程序在X86、linux机器上编译后的运行结果为7,而在SPARC/SUNOS机器上编译后的运行结果为6.试分析结果不同的原因。

    jiajia.s

    	.file	"jiajia.c"
    	.section	.rodata
    .LC0:
    	.string	"%ld\n"
    	.text
    	.globl	main
    	.type	main, @function
    main:
    .LFB0:
    	.cfi_startproc
    	pushq	%rbp
    	.cfi_def_cfa_offset 16
    	.cfi_offset 6, -16
    	movq	%rsp, %rbp
    	.cfi_def_cfa_register 6
    	subq	$16, %rsp
    	movq	$0, -8(%rbp)
    	addq	$1, -8(%rbp)
    	addq	$1, -8(%rbp)	//i先增加2,i=2
    	movq	-8(%rbp), %rax	//移入i至DX寄存器
    	leaq	(%rax,%rax), %rdx	//i+i=4
    	addq	$1, -8(%rbp)	//i增加,i=3
    	movq	-8(%rbp), %rax	//移入i至AX寄存器
    	addq	%rdx, %rax	//4+3=7,结果存AX寄存器
    	movq	%rax, %rsi
    	movl	$.LC0, %edi
    	movl	$0, %eax
    	call	printf
    	leave
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	main, .-main
    	.ident	"GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
    	.section	.note.GNU-stack,"",@progbits



    jiajia2.c
    #include<stdio.h>
    
    
    int main()
    { 
    	long i; 
    	i=0; 
    	printf("%ld\n",(++i)+((++i)+(++i))); //改为后两个加括号
    }




    结果输出9


    jiajia2.s

    	.file	"jiajia2.c"
    	.section	.rodata
    .LC0:
    	.string	"%ld\n"
    	.text
    	.globl	main
    	.type	main, @function
    main:
    .LFB0:
    	.cfi_startproc
    	pushq	%rbp
    	.cfi_def_cfa_offset 16
    	.cfi_offset 6, -16
    	movq	%rsp, %rbp
    	.cfi_def_cfa_register 6
    	subq	$16, %rsp
    	movq	$0, -8(%rbp)
    	addq	$1, -8(%rbp)
    	addq	$1, -8(%rbp)
    	addq	$1, -8(%rbp)	//i增加至3,i=3
    	movq	-8(%rbp), %rax
    	leaq	(%rax,%rax), %rdx	//i+i=6
    	movq	-8(%rbp), %rax
    	addq	%rdx, %rax	//3+3=9
    	movq	%rax, %rsi
    	movl	$.LC0, %edi
    	movl	$0, %eax
    	call	printf
    	leave
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	main, .-main
    	.ident	"GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
    	.section	.note.GNU-stack,"",@progbits


    展开全文
  • 关于C语言表达式求值问题的解释

    千次阅读 2015-11-01 01:35:27
    很多新手对于C的表达式求值(如i++ + ++i)这一问题感到十分的疑惑,不能很好地理解,今日小轩献丑,准备为新手们解释一下,如有不通之处,请各位同道指出。 首先,贴上裘老的解释:...
  • c语言表达式求值顺序

    千次阅读 2007-09-23 21:29:00
    c语言没有明确规定表达式求值顺序!除了逻辑表达式的短路求值! 例如下面的程序:int a = 10;int func(){ a = 5; return 5;}a + func()的值就不定。在gcc下是先计算func,所以值为10java明确规定了求值顺序是从...
  • #include <stdio.h> int main() { int y, x = 10; y = (x++)+(--x)+(x++); printf("%d\n", y); } 这个程序输出结果为什么是27?
  • 表达式表示在编译或运行期间计算出来的一个,由地址(如常量、变量或函数调用)和运算符(如*, /, + 或 -)组成。地址的数据类型和所用的运算符决定了表达式的类型。在SCL中可能有下列表达式:一、表达式概述:1、算术...
  • 如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号...
  • c语言实现表达式求值

    千次阅读 2020-03-14 12:10:48
    C语言实现表达式求值C语言实现表达式求值算法。要求从键盘输入任意的包含加减乘除的算术四则运算表达式,都能求值。操作数类型可以设定为double。 以下是代码 #include <stdio.h> #include <stdlib.h>...
  • 我们今天继续看一下,如何使用栈完成标准的四则混合运算表达式求值。不同于后缀表达式,遇到一个运算符就可以直接从栈里取两个数进行运算。在标准的四则混合运算表达式中(或者我们称之为中缀表达式),遇到一个操作符...
  • 一、目的理解中缀表达式求值的过程理解中缀转后缀表达式求值的过程掌握堆栈的应用二、问题描述缀表达式,其中包含括号,加减乘除,乘方等运算,利用中缀表达式,对表达式分析并求值入的中缀表达式转换为后缀形式,...
  • C的基本程序步骤由语句 (statements) 组成,而大多数语句都由表达式 expression) 构成。因此,我们先学习表达式。 1 表达式表达式(expression)由运算符和运算对象组成。最简单的表达式是一个单独的运算对象,以此为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,244
精华内容 497
关键字:

c语言表达式求值

c语言 订阅