条件表达式的值必须参与运算符与表达式是什么意思

IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
对于未经训练的用户来说,计算机科学领域中数学表达式求值的传统方法即不顺手又难以使用;软件工程师 Nikola.Stepan
旨在改变这些传统方法。他的 applet W3Eval 对表达式求值与您用纸笔计算的一系列步骤完全一致,但更快并且没有错误。请往下读,了解这一挑战 ―
人类易读的数学到 Java 代码的转换。
(), 软件工程师
Nikola Stepan 是 ABIT Ltd. 的软件工程师,他在那里从事银行业软件的设计和开发。他有广博的信息系统方面的学术背景和丰富的编程经验(从低级编程到信息系统)。他特别喜欢面向对象编程语言、关系数据库、因特网编程和系统编程。他于 1999 年在克罗地亚 Varazdin 的 Faculty of Organisation and Informatic 获得信息系统学士学位。他会说克罗地亚语、英语和一点德语。请通过
与 Nikola 联系。
还记得在您的第一台科学计算器上用逆波兰表示法奋斗的经历吗?W3Eval applet 无法让您可信赖的 HP-41 更易用,正如它的名称所暗示 ―
一个只能运行于 Web 的表达式求值程序。但它的确提供了一种方法 ― 人类更易于遵循的对表达式一步一步的求值。W3Eval
的方法与传统计算器不同,却和人类的计算方式一致。当您用传统的计算器计算时,每输入一个新数,前一个数就看不到了。如果在输入一个长表达式中出了错,就得全部重来。有了
W3Eval,您就能看到参与计算的所有东西,还能轻松的编辑表达式。它独特的能力(一步一步的对表达式求值)非常容易实现,因为用户能看到求值的每一步,包括临时结果。本文将让您从头至尾认识 W3Eval 功能性的要点;您将看到一些用于表达式求值的代码。不过,我们还是先看看表达式求值的经典算法,这样您就会明白
W3Eval 方法的差异究竟有多少。表达式求值的经典算法编写代码对算术表达式求值的经典方法由 Donald Knuth 描述于 1962 年(请参阅 )。Knuth 将此概括为三个步骤: 对中缀表达式进行语法分析中缀表达式到后缀表达式的转换对后缀表达式求值注意到我们谈到的这个经典算法有些简化:算术表达式只包含操作数、二元操作符和一种括号。此外,对于每个操作数和操作符,只用单个字符表示,使语法分析直观。表达式表示法 算术表达式中最常见的表示法形式有 中缀、前缀和
后缀表示法。中缀表示法是书写表达式的常见方式,而前缀和后缀表示法主要用于计算机科学领域。 中缀表示法中缀表示法是算术表达式的常规表示法。称它为
中缀表示法是因为每个操作符都位于其操作数的中间,这种表示法只适用于操作符恰好对应两个操作数的时候(在操作符是二元操作符如加、减、乘、除以及取模的情况下)。对以中缀表示法书写的表达式进行语法分析时,需要用括号和优先规则排除多义性。 Syntax: operand1 operator operand2
Example: (A+B)*C-D/(E+F)前缀表示法前缀表示法中,操作符写在操作数的前面。这种表示法经常用于计算机科学,特别是编译器设计方面。为纪念其发明家
― Jan Lukasiewicz(请参阅 ),这种表示法也称
波兰表示法。 Syntax
: operator operand1 operand2
Example : -*+ABC/D+EF后缀表示法在后缀表示法中,操作符位于操作数后面。后缀表示法也称
逆波兰表示法(reverse Polish notation,RPN),因其使表达式求值变得轻松,所以被普遍使用。 Syntax
: operand1 operand2 operator
Example : AB+C*DEF+/-前缀和后缀表示法有三项公共特征:操作数的顺序与等价的中缀表达式中操作数的顺序一致不需要括号操作符的优先级不相关中缀表达式到后缀表达式的转换 要把表达式从中缀表达式的形式转换成用后缀表示法表示的等价表达式,必须了解操作符的优先级和结合性。
优先级或者说操作符的强度决定求值顺序;优先级高的操作符比优先级低的操作符先求值。
如果所有操作符优先级一样,那么求值顺序就取决于它们的
结合性。操作符的结合性定义了相同优先级操作符组合的顺序(从右至左或从左至右)。 Left associativity
: A+B+C = (A+B)+C
Right associativity : A^B^C = A^(B^C)转换过程包括用下面的算法读入中缀表达式的操作数、操作符和括号:初始化一个空堆栈,将结果字符串变量置空。从左到右读入中缀表达式,每次一个字符。如果字符是操作数,将它添加到结果字符串。如果字符是个操作符,弹出(pop)操作符,直至遇见开括号(opening
parenthesis)、优先级较低的操作符或者同一优先级的右结合符号。把这个操作符压入(push)堆栈。如果字符是个开括号,把它压入堆栈。如果字符是个闭括号(closing parenthesis),在遇见开括号前,弹出所有操作符,然后把它们添加到结果字符串。如果到达输入字符串的末尾,弹出所有操作符并添加到结果字符串。后缀表达式求值对后缀表达式求值比直接对中缀表达式求值简单。在后缀表达式中,不需要括号,而且操作符的优先级也不再起作用了。您可以用如下算法对后缀表达式求值:初始化一个空堆栈从左到右读入后缀表达式如果字符是一个操作数,把它压入堆栈。如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。到后缀表达式末尾,从堆栈中弹出结果。若后缀表达式格式正确,那么堆栈应该为空。W3Eval:一种新的方法W3Eval
的方法与上面概括的经典算法不同。不是把中缀表达式转换为后缀表示法;恰恰相反,它对中缀表达式直接求值。这种方法比传统方法稍微复杂了些,但它支持一步一步的求值,在执行时您能看到每一步。求值过程类似于手工计算:如果表达式中包含括号,先求嵌套最深的括号对中的子表达式的值。所有括号内的子表达式都求值完毕后,表达式的其它部分再求值。求值过程分为三个步骤:表达式语法分析表达式检查一步一步的求值表达式语法分析 W3Eval 的数学表达式由数字、变量、操作符、函数和括号组成。除了缺省的十进制计数制外 W3Eval
还支持二进制、八进制和十六进制。这些以其它计数制计数的数必须以 # 开头,并紧跟 b 、
o 或者 h 来分别表示二进制、八进制或十六进制。 W3Eval 的变量是不限长度的大写字母和数字序列,其首字符必须是字母。W3Eval 有一些预定义的变量,不过它也支持用户定义的变量。W3Eval 支持带有固定或不定数量自变量的函数。 函数可分为以下几组:三角函数(sin、cos、tan、cot、sec、csc)反三角函数(asin、acos、atan、atan2、acot、asec、acsc)双曲线函数(sinh、cosh、tanh、coth、sech、csch)反双曲线函数(asinh、acosh、atanh、acoth、asech、acsch)指数函数(log、log2、log10、exp、exp2、exp10、sqrt、cur)组合学函数(Combinatoric)(comb、combr、perm、permr、var、varr)统计函数(sum、avg、min、max、stddev、count)其它(abs、ceil、fact、floor、pow、random、rint、round、sign、frac、hypot、deg、rad、trunc、int)W3Eval 对表达式进行
语法分析,也就是指它识别出表达式的算术成分,并将它们转化成语言符号(token),然后把它们放入向量。表达式一旦处于这种状态,就为下面两步做好了准备:表达式检查和求值。 W3Eval 的 符号(token)是算术表达式的组成部分; 记号(mark)是独立的字符, 由 applet
使用,作为识别各种符号的内部标志。每种符号有唯一的 mark 与之对应。W3Eval 的表达式由表 1 所示的符号组成。 表 1. W3Eval 的符号TokenMark类十进制数Double二进制数String十六进制数String八进制数String变量Variable函数Function操作符Operator开括号String闭括号String逗号String用以表示函数、操作符和变量类的定义如清单 1 所示:清单 1. Function、Operator 和 Variable
类的定义public class Function
public int number_of_
public Function( String function, int number_of_arguments )
this.function=
this.number_of_arguments=number_of_
public String toString()
public class Operator
public Operator( String operator, byte priority )
this.operator=
this.priority=
public String toString()
public class Variable
public Variable( String variable, double value )
this.variable=
this.value=
public String toString()
}Token 类如清单 2 所示。 清单 2. Token
类public class Token
public Token ( Object token, char mark, int position, int length )
this.token=
this.mark=
this.position=
this.length=
public String toString()
return token.toString()+" ; "+mark+" ; "+position+" ; "+length+"
}表达式检查检查正规表达式正确性的所有代码都在一个独立的类中。详细的表达式检查能够确定错误确切的类型和位置。 错误检查有七类:括号检查。W3Eval
的表达式可以包含三种括号:标准圆括号、方括号和花括号。如果表达式包含相同数量的开括号和闭括号,并且每个开括号与一个相应的同种闭括号相匹配,则表达式的括号语法正确。三种括号在语义上等价,如下面的代码段所示。 清单 3.
三种括号import java.util.S
public class Parentheses_check
public static boolean is_open_parenthesis( char c )
if ( c=='(' || c=='[' || c=='{' )
public static boolean is_closed_parenthesis( char c )
if ( c==')' || c==']' || c=='}' )
private static boolean parentheses_match( char open, char closed )
if ( open=='(' && closed==')' )
else if ( open=='[' && closed==']' )
else if ( open=='{' && closed=='}' )
public static boolean parentheses_valid( String exp )
s = new Stack();
for ( i=0; i & exp.length(); i++ )
current_char=exp.charAt( i );
if ( is_open_parenthesis( current_char ) )
c=new Character( current_char );
s.push( c );
else if ( is_closed_parenthesis( current_char ) )
if ( s.isEmpty() )
c=(Character)s.pop();
c1=c.charValue();
if ( !parentheses_match( c1, current_char ) )
if ( !s.isEmpty() )
}token 检查。检查表达式语法。确保表达式所有部分都被认为是合法的。 表达式开头的检查(请参阅 )
。确保表达式从合法的符号开始。不可以用操作符、逗号或闭括号作为表达式的开始符。 清单 4.
正确的表达式开头的检查private static boolean begin_check( Vector tokens, Range r, StringBuffer err )
t=(Token)tokens.elementAt( 0 );
if ( mark=='P' )
err.append( Messages.begin_operator );
else if ( mark==')' )
err.append( Messages.begin_parenthesis );
else if ( mark=='Z' )
err.append ( Messages.begin_comma );
r.start=0;
}表达式末尾的检查。确保表达式以合法符号结束。不可以用操作符、函数、逗号或开括号作为表达式结束符。 符号序列的检查。检查表达式中的符号序列。在下面的表格中,若 X 轴上的符号和 Y 轴上的符号对应的交界处用 X
作了记号,则相应 X 轴上的符号可以接在 Y 轴上符号的后面。 表 2. 合法的符号序列_DBHOVFP()ZD______犠_犠犠B______犠_犠犠H______犠_犠犠O______犠_犠犠V______犠_犠犠F_______犠__P犠犠犠犠犠犠_犠__(犠犠犠犠犠犠_犠__)______犠_犠犠Z犠犠犠犠犠犠_犠__函数检查。确保表达式中所有函数的自变量数量正确。 逗号检查。逗号只能用于分隔函数的自变量。若用于表达式其它地方,就不合法。 一步一步的求值只有能顺利通过以上概括的所有检查的表达式,W3Eval 才求值。从而确保内建于 W3Eval
中的前提条件不会出现问题。后面的算法用于单步执行表达式求值:找出嵌入最深的那对括号。在这对括号中,找出优先级最高的操作符。若这对括号中没有操作符: 如果表达式再不包含任何其它的括号,求值(过程)完成。如果表达式包含括号,但不包含操作符,则存在一个函数。对函数求值,然后转到步骤 5。获取操作数并执行运算。从向量中除去用过的符号并在同一位置放入结果。除去冗余括号。将向量中剩余的符号结合到字符串并在屏幕上显示结果。现在,我们将更为详细的查看算法的每一步,同时查看大部分有意思的代码片段。步骤 1:为避免括号的处理,W3Eval
确定哪个子表达式处于嵌套最深的那对括号中。这项任务需要两步。第一步,W3Eval 必须找出第一个闭括号: 清单 5.
找出第一个闭括号public static int pos_first_closed_parenthesis( Vector tokens )
for ( int i=0; i&tokens.size(); i++ )
t=(Token)tokens.elementAt( i );
if ( t.mark==')' )
}第二步,找出与第一步找到的闭括号相匹配的开括号,如 。 清单 6.
找出匹配的开括号public static int pos_open_parenthesis( Vector tokens, int closed_parenthesis )
i=closed_parenthesis-2;
while ( i&=0 )
t=(Token)tokens.elementAt( i );
if ( t.mark=='(' )
}步骤 2:要实现求值的单步执行,W3Eval
在嵌套最深的那对括号中找出优先级最高的操作符。(操作符的优先级已硬编码到 applet 中;请参阅 以获取完整的代码清单。) 清单 7.
找出优先级最高的操作符public static int pos_operator( Vector tokens, Range r )
max_priority=Byte.MAX_VALUE;
max_pos=0;
for ( int i=r.start+2; i&=r.end-2; i++ )
t=(Token)tokens.elementAt( i );
if ( t.mark!='P' )
priority=((Operator)t.token).
operator=((Operator)t.token).
if ( priority & max_priority || ( operator.equals("^") ||
operator.equals("**") ) && priority == max_priority )
max_priority=
max_pos=i;
return max_
}步骤 3:如果表达式中不包含其它括号,求值的过程就完成。如果表达式包含括号,但不包含操作符,则存在需要求值的函数。 清单 8.
检查是否还有其它操作符...
int poz_max_op=pos_operator( tokens, range );
// if there are no operators
if ( poz_max_op==0 )
if ( no_more_parentheses )
result=function_result( tokens, range.start-1 );
function_tokens_removal( tokens, range.start-1 );
t = new Token ( new Double(result), 'D', 0, 0 );
tokens.setElementAt( t, range.start-1 );
parentheses_removal( tokens, range.start-1 );
...步骤 4:所有的操作符都是二元的,也就是说第一个操作数位于操作符之前,第二个操作符位于操作符之后。 清单 9.
获取操作数并执行运算...
double operand1, operand2;
// first operand is before...
t=(Token)tokens.elementAt( poz_max_op-1 );
operand1=operand_value( t );
// ...and second operand is after operator
t=(Token)tokens.elementAt( poz_max_op+1 );
operand2=operand_value( t );
// operator
t=(Token)tokens.elementAt( poz_max_op );
String op=((Operator)t.token).
double result=operation_result( operand1, operand2, op );
tokens.removeElementAt( poz_max_op+1 );
tokens.removeElementAt( poz_max_op );
t = new Token ( new Double(result), 'D', 0, 0 );
tokens.setElementAt( t, poz_max_op-1 );
parentheses_removal( tokens, poz_max_op-1 );
...操作数可以是变量,还可以是十进制、十六进制、八进制或二进制数。清单 10.
获取操作数public static double operand_value( Token t )
if ( t.mark=='V' )
return ((Variable)t.token).
else if ( t.mark=='D' )
return ((Double)t.token).doubleValue();
else if ( t.mark=='H' )
return base_convert( ((String)t.token).substring(2), 16 );
else if ( t.mark=='O' )
return base_convert( ((String)t.token).substring(2), 8 );
else if ( t.mark=='B' )
return base_convert( ((String)t.token).substring(2), 2 );
}接下来的方法将不同计数制的数转化为十进制的形式。清单 11.
将数转化为十进制数public static long base_convert( String s, int base )
for ( i=s.length()-1, j=0; i&=0; i--, j++ )
r=r+digit_weight( s.charAt( i ) )*(long)Math.pow( base, j );
public static int digit_weight( char c )
if ( Character.isDigit( c ) )
return c-48;
else if ( 'A'&=c && c&='f' )
return c-55;
else if ( 'a'&=c && c&='f' )
return c-87;
return -1;
}一旦确定操作数和操作符后,就可以执行运算了,如
所示。 步骤 5:在这步中,W3Eval
从向量中除去用过的符号并在同一位置放入结果。对于函数求值这类情况,除去的是函数、括号、自变量和逗号;而对于操作符求值这类情况而言,除去的则是操作数和操作符。 步骤 6:在求值的这一步,W3Eval 从表达式中除去冗余括号。 清单 13.
除去冗余括号private static void parentheses_removal( Vector tokens, int pos )
((Token)tokens.elementAt( poz-2 )).mark!='F' &&
((Token)tokens.elementAt( poz-1 )).mark=='(' &&
((Token)tokens.elementAt( poz+1 )).mark==')'
((Token)tokens.elementAt( 0 )).mark=='(' &&
((Token)tokens.elementAt( 2 )).mark==')'
tokens.removeElementAt( poz+1 );
tokens.removeElementAt( poz-1 );
}步骤 7:在求值的最后一步,向量中剩余的符号被结合到字符串,并在屏幕上显示。 清单 14.
结合符号并显示结果public static String token_join( Vector tokens )
result=new String();
for ( int i=0; i & tokens.size(); i++ )
t=(Token)tokens.elementAt( i );
if ( t.mark=='D' )
double n=((Double)t.token).doubleValue();
result=result + formated_number( n );
result=result + t.
if ( result.endsWith( ".0" ) )
result=result.substring( 0, result.length()-2 );
result=result + " ";
}结论本文分析了一个 applet ,它能一步一步的对算术表达式求值。同时还按顺序回顾了最有意思的代码片段,并论述了两种不同的表达式求值方法。下一版 W3Eval
有望在各方面得到增强,包括有能力添加用户定义的功能;支持分数、复数和矩阵;改良的图形用户界面(GUI);大小和速度优化以及安全性方面的增强。我鼓励您提供您自己对于增强方面的设想。我希望您会发现 W3Eval 是个对表达式求值有益的在线工具,它在某种程度上比经典的方法更简单自然。我还期待这里谈到的代码和算法使您明白 Java
语言有助于处理数学问题。
参考资料 您可以参阅本文在 developerWorks 全球站点上的 。是免费的,它的 有助于您解决问题。 这张表格展示了 。 请阅读波兰数学家 的传记。 Donald
Knuth,计算机科学领域卓越的学者,曾详尽的就算法的设计和分析撰写和演讲。他的 提供最近出版的有关其作品的论文和信息的链接。 有兴趣随意编写 applet 吗?可以查看我们的教程 (developerWorks,1999 年)以获得一步一步的指导。 您会觉得 很有用。 还有很多有关 applet 的信息在 Peter Van Der
Linden(Prentice Hall PTR/Sun Microsystems 出版社出版,1998 年 12 月)的 Just
Java 2中。 由 Ken Arnold、James Gosling 和 David Holmes
撰写的 (Addison Wesley
出版社出版,2000 年 12 月)包含有益的关于集合的信息。 学习 Martin Bastiaan 的 (developerWorks,1998 年 1 月),了解更多有关 applet
的知识。 使
applet 的开发变得轻而易举。 :这里有数百篇关于 Java 编程各个方面的文章。 加入 ,查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technologyArticleID=53210ArticleTitle=快速精确的对数学表达式求值publish-date=查看: 1030|回复: 5
用什么函数筛选出满足多重条件的值参与运算
阅读权限10
在线时间 小时
本帖最后由 佳人在望 于
11:02 编辑
情况是这样的,公司要记录运输费用,由于有很多不同的条件会有不同的价格,比如不同地区、不同车型、不同的装载率使用的计算单价都不一样,我想用函数把符合条件的单价筛选出来参与运算出一个预计的运费,与实际供应商的开票金额进行核对。
线路承运商车型单批价格 单位立方价格最低立方数ADH<font color="#吨<font color="#00<font color="#0<font color="#BCML<font color="#吨<font color="#00<font color="#0<font color="#CCML<font color="#吨 <font color="#00<font color="#0<font color="#DDH<font color="#吨<font color="#00<font color="#0<font color="#EAE<font color="#吨<font color="#00<font color="#0<font color="#FDH<font color="#吨<font color="#000<font color="#0<font color="#* 不同的线路
* 不同的承运商
* 不同的车型
* 在不满足“最低立方数”的情况下,使用&单批价格&
* 如果超过“最低立方数”,则使用“实际发货立方数”乘以“单位立方价格”* 实际发货立方数是可以依据托盘和包装的层数可以推算出来的
我再说明一下,我们有3家运输供应商,针对不同的线路都有不同的报价,有些短途用的都是2吨车型,有些长途会用5吨或者8吨车,但是供应商不同,会有不一样的立方单价和批次价格。
手工输入的内容有:线路、托盘数(可以算出立方数),我想用这些基础数据去找出对应的车型和运输商(低价格优先),然后比对实际立方数与最低立方数的关系去算出运输费用总计。
19:25 上传
点击文件名下载附件
4.31 KB, 下载次数: 16
阅读权限10
在线时间 小时
先谢谢各位大侠了
阅读权限100
在线时间 小时
条件不全啊。没办法算啊。
阅读权限30
在线时间 小时
公式“=(实际立方数&=最低立方数)*单位立方价格+(实际立方数&=最低立方数)*单批价格”向下拖即可以实现
阅读权限10
在线时间 小时
bxr613 发表于
公式“=(实际立方数&=最低立方数)*单位立方价格+(实际立方数
难道不考虑线路和车型吗?不同的线路和车型都有不一样的单价
阅读权限10
在线时间 小时
lgcmeli 发表于
条件不全啊。没办法算啊。
还需要什么条件? 线路和车型和单价都有了呀,就是要挑选出来
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师C语言中条件运算符是什么意思_百度知道
C语言中条件运算符是什么意思
条件运算符(?:)是C语言中唯一具的三目运算符,就是说它有三个运算对象。条件运算符的形式是&? :&由它构成的表达式称为条件表达式条件表达式的形式为: 表达式1 ? 表达式2 : 表达式3例如:(a&b)?a+b:a-b其中,如果a=2,b=1,那么a&b成立,执行a+b这个表达式,运算结果为3;但如果a=2,b=3,那么a&b不成立,那么执行a-b这个表达式,运算结果为-1.
其他类似问题
为您推荐:
的意思是&后的表达式值?a;前的表达式值:&;,否则取&quot?&前的表达式运算结果如果为true,则取&b;?。比如
c=a&gt:b;是求a,b的最大值:&quot
有点类似if else 的意思 具体看这个:
您可能关注的推广
条件运算符的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁表达式必须是可修改的左值是什么意思_百度知道
表达式必须是可修改的左值是什么意思
b=4,c=5;int d,x,y;d=!(a+b)+c-1&&b=c&#47;2int a=3
提问者采纳
&比赋值的运算优先级高,这是不允许的,因此这个表达式是d=((!(a+b)+c-1&&b)=c&#47!(a+b)+c-1&&b);2)相当于把c/2复制给(
提问者评价
谢谢,自己打错了,你的解释很到位
来自团队:
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言问题:条件运算符选择题_百度知道
C语言问题:条件运算符选择题
a=3;a,k&lt; A.2 C,b=2.4 求算法的思路:c&lt,c=l?c;printf(&quot.1
D;%d&#47;n&?k:a)下列程序段执行后的输出结果是(
) int k=-4
不用解释条件运算符的含义。要是解题过程,答案是怎么算出来的
提问者采纳
这个是条件表达式。使用条件表达式时:b;b为真?c:c&
else max=b;b;执行该语句的语义是,表示如果a为真??a?a:d)这也就是条件表达式嵌套的情形:b2)
条件运算符;d:
if(a&gt,如果a为假,否则把b 赋予max,则表达式值为c条件表达式具体说明如下条件语句。3)
条件运算符的结合方向是自右至左?a?c:1)
条件运算符的运算优先级低于关系运算符和算术运算符;b;b?k;b)
max=a,不能分开单独使用?c。例如。因此
max=(a&b;可用条件表达式写为
max=(a&gt?a?a:a&b):如a&a:是一对运算符,则把a赋予max,还应注意以下几点:b可以去掉括号而写为
max=a&gt,即其中的表达式3又是一个条件表达式,但高于赋值符,则表达式值为b?和。 k&d:(c&lt:d应理解为a&gt:(c&gt:a)-4&b):这个是三目运算符
“-4&3正确就是K=4 ”
这句话是什么意思,听不明白
-4&3这个是成立的,就做?后的K。
如果条件本身不成立,就做:后的。
提问者评价
来自团队:
其他类似问题
为您推荐:
其他3条回答
然后进行判断条件运算符是惟一有3个操作数的运算符?b,从右向左分组计算?x,先计算条件b?b,所以有时又称为三元运算符,a。条件运算符是向右结合的?d,计算y的值:y。一个条件表达式从不会既计算x,运算结果为y的值。你这个没有答案啊,运算结果为x的值:(c。如果b的值为true;否则,也就是说,计算x的值?d:c,又计算y:e)执行。例如:e将按a,应该是k=4吧。对于条件表达式b
你可以换成如下方式理解:if (k&a)
结果为kelse if(c&b)
结果为celse
结果为a。这样就很明白了吧。
k&a?k:(c&b?c)所以,-4...
条件运算符的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 el表达式三元运算符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信