运 算 符

用来表示各种运算的符号称为运算符。例如,数值运算中经常用到的加、减、乘、除符号就是运算符。由于它们是进行算术运算的,所以称为算术运算符。
C语言中的运算符大都直接采用键盘上的符号,例如,算术运算符中的加、减、乘、除就分别采用+、-、*、/来表示。
  运算符必须有运算对象。C语言中的运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。单目运算符若放在运算对象的前面称为前缀单目运算符;若放在运算对象的后面称为后缀单目运算符。双目运算符都是放在两个运算对象的蹭。三目运算符在C语言中只有一个(条件运算符),是夹在三个运算对象之间的。
  每个运算符都代表对运算对象的某种运算,都有自己特定的运算规则。每个运算符运算的对象都规定了数据类型,同时运算结果也有确定的数据类型。因此把运算符也划分为若干种类型。例如,对数值型对象运算,结果仍是数值型的称为算术运算符,结果是逻辑值(真或假)的称为关系运算符等等。
  用运算符把运算对象连接起来所组成的运算式在C语言中称为"表达式"。每个表达式都可以按照运算符的运算规则进行运算,并最终获得一个值,称为表达式的值。
  当表达式中出现多个运算符,计算表达式值时,就会碰到哪个先算,哪个后算的问题,我们把这个问题称为运算符的优先级。计算表达式值时,优先级高的运算要先进行。注意,在复杂的表达式中,用圆括号括住的部分要先算,其优先级别高于任何运算符。若在圆括号中又有圆括号,则内层圆括号优先于外层圆括号。
  同级别的运算符还规定了结合性。若是自左向右先碰到谁先算谁,则结合性称为自左向右的;若是自右向左先碰到谁先算谁,则结合性称为自右向左的。
  C语言的运算符十分丰富,有30多种,其分类大致如图2-2所示。本节将介绍其中的基本运算符,其它运算符将在后续章节中介绍。


                  ┌基本算术运算符( +,-,+,-,*,/,% )
            ┌算术运算符┤
            │     └增1减1运算符( ++,-- )
            │
            │关系运算符( >,<,==,>=,<=,!= )
            │逻辑运算符( !,&&,|| )
            │
            │     ┌基本赋值运算符( = )
      ┌基本运算符┤赋值运算符┤
      │     │     └算术自反赋值运算符( +=,-=,*=,/=,%= )
      │     │
      │     │逗号运算符(,)
      │     │条件运算符(? :)
C语言运算符┤     │数据长度运算符(sizeof)
      │     │
      │     │    ┌位逻辑运算符( ~,&,|,^ )
      │     └位运算符┤位移位运算符( >>,<< )
      │           └位自反赋值运算符( &=,|=,^=,>>=,<<= )
      │    
      │     ┌强制运算符( ( ) )
      └专用运算符┤下标运算符( [ ] )
            │成员运算符( ->,.)
            └指针运算符( &,*,+,- )
 
                图2-2 C语言运算符分类

  注意C语言中的运算符都是键盘上的符号(如 |、~、^ 等)或若干符号的组合(如 &&、||、>>、<<、->等),书写或输入时不要出错。此外,少数运算符号有双重含义,主要有下列几个:
  (1)"+"号。在算术运算中既表示单目的取正运算,又可表示双目的加法运算,在指针运算中表示双目的加法运算。
  (2)"-"号。在算术运算中既表示单目的取负运算,又可表示双目的减法运算,在指针运算中表示双目的减法运算。
  (3)"*"号。在算术运算中表示双目的乘法运算,在指针运算中表示指针变量指向的变量。
  (4)"&"号。在位逻辑运算中表示双目"与"运算,在指针运算中表示取地址的运算。
  这些两重含义运算符的理解与当时的运算对象有关,在学习时要注意区分。

  计算机程序是由若干条语句组成的语句序列,但是程序的执行并不一定按照语句列的书写顺序,程序中语句的执行顺序称为“程序结构”。如果程序中的语句是按照书写顺序执行的,我们称其为“顺序结构”;如果某些语句是按照当时的某个条件来决定是否执行,称其为“选择结构”;如果某些语句要反复执行多次,称其为“循环结构”。
  本章介绍实现这三种结构的相关语句,同时还介绍这三种结构的程序设计方法和编辑、高度、运行C程序的开发环境。

 2.4.1 算术运算符

  算术运算符包括基本算术运算符和增1、减1运算符,其中基本运算符常简称为算术运算符。

 1. 基本算术运算符

  基本算术运算符是对数据进行简单算术运算的。要注意字符型数据也可以看成整型数据,参加基本算术运算。
基本算术运算符的运算对象、运算规则与结果、结合性如表2-4所示。

  两个单目运算符都是前缀运算符。单目正(+)运算不改变运算对象的值,很少使用。单目负(-)运算是驻运算对象的负值。例如,+3的结果是正整数3,-3的结果是负整数3。
  双目加(+)、减(-)、乘(*)运算和普通算术运算中的加法、减法和乘法相同。例如,2.1+3.6的结果是5.7;2.1-3.6的结果是-1.5;2.1*3的结果是6.3。
  双目除运算(/)和运算对象的数据类型有关。若两个对象都是整型数据,该运算称为"整除",即获得的商是整数。若商有小数,则截去小数部分。若两个运算对象有一个或两个都是实型,则运算结果是实型。例如,14/5,结果为2;而14/5.0,则结果为2.8。
  双目模运算(%)的对象必须是整型数据,结果是整除后的余数。例如,14%5的结果为4(商为2);14%4的结果为2(商为3)。注意运算结果的符号与被除数相同,例如,13%3、13%-3的结果均为1(商分别为4、-4);-13%3、-13%-3的结果均为-1(商分别为-4、4)。
  算术运算符的优先级规定如下:
   .单目基本算术运算符  优先于 双目基本算术运算符
   .*、/、% 优先于 +、-
   .同级单目基本算术运算符的结合性是自右向左
   .同级双目基本算术运算符的结合性是自左向右
  【例2-1】基本算术运算符的使用。
   设变量定义如下:int n=10,m=3;
           float f=5.0 ,g=10.0;
           double d=5.0,e=10.0;
   则:-n的结果是-10
     n+m、n-m、n*m、n%m的结果分别为13、7、30、3、1
     d+e、d-e、d*e、d/e的结果分别为15.0、-5.0、50.0、0.5
     n+m-f*g/d的运算顺序相当于(n+m)-((f*g)/d),结果是3.0
     n%m*f*d的运算书写相当于((n%m)*f)*d,结果是25.0

 2. 增1减1运算符

  增1减1运算符都是单目运算符,是用来对整型、字符型、指针型以及数组的元素等变量进行算术运算的,运算的结果仍是原类型,并存回原运算对象。用增1减1运算符和运算对象组成表达式时,运算符可以放在运算对象的前面(称前缀),也可以放在运算对象的后面(称后缀),前缀和后缀的功能略有不同。
  增1减1运算符的运算对象、运算规则与结果、结合性如表2-5所示。

  增1(或减1)运算符作为前缀使用时,是先对运算对象加1(或减1),然后再使用加1(或减1)后的运算对象。增1(或减1)运算符作为后缀使用时,是先使用不加1(或减1)的运算对象,然后再对运算对象加1(或减1)。
  增1减1运算符的优先级如下:
  ·增1减1运算符 优先于 双目基本算术运算符
  ·增1减1运算符和单目基本算术运算符+、-同级别,结合性是自右向左
  例如,设整型变量a为2,则:
      ++a+1 结果为4,变量a为3
      a--+1 结果为3,变量a为1
  当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可能多的符号组成运算符。
  当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可能多的符号组成运算符。
  例如,设整型变量a、b均为2,则:
      a+++b 应理解成(a++)+b,结果为4,a为3,b不变
      a---b 应理解成(a--)-b,结果为0,a为1,b不变
  【例2-2】增1减1运算符的使用。
   设变量定义如下:char c1='b',c2='B';(c1、c2可看成整型,其值分别为98、66)
   则:++c1的值是99,运算后c1的值是'c'
    c1--的值是98,运算后c1的值是'a'
    c1+++c2的值是164,运算后c1的值是'c',c2的值是'B'
    c1---c2的值是32,运算后c1的值是'a',c2的值是'B'

 2.4.2 关系运算符

  关系运算符是用来比较两个数据大小的,运算的结果是成立或不成立。如果成立,则结果为逻辑值"真",用整数"1"表示;如果不成立,则结果为逻辑值"假",用整数"0"表示。
  关系运算符的运算对象、运算规则与结果、结合性如表2-6所示。

  所有关系运算符都是双目运算符,所组成的表达式称为关系表达式。关系表达式的结果是逻辑值,若为"真"用整数1表示;若为"假"用整数0 表示。
  关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符型数据的大小。字符数据比较时是按该字符对应的ASCII代码值的大小进行比较,其实质也是数值比较。
  关系运算符的优先级如下:
   .算术运算符  优先于  关系运算符
   .<,<=,>,>= 优先于 = =,!=
   .<,<=,>,>= 同级,结合性是自左向右
   .= =,!= 同级,结合性是自左向右
  因此,"3<2<2"作为关系式来说是正确的,先计算"3<2"的结果为"0"(假);再计算"0<1"的结果是"1"(真)。当然,这个计算过程与原式数学中的含义(3<2 并且2<1)是不同的,这一点请读者特别注意。
  【例2-3】关系运算符的使用。
   设变量定义如下:char c1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
           int n1=65,n2=97;
           float f1=0.3E1,f2=3.0001;
   则:c1>c2、n1<n2、f1= =f2的值依次是1、1、0
     c1>=n1、c2>=n2、c1= =n2的值依次是1、0、1
     f1>c1、f2<c2、f1= =n1-62的值依次是0、1、1
     c1>c2>=1<=0= =1!=0的值是0
      注:运算顺序相当于((((c1>c2)>=1)<=0)= =1)!=0
     c1>c2>=n1<=n2==f1!=f2的值是1
      注:运算顺序相当于((((c1>c2>)=n1)<=n2)= =f1)!=f2

 2.4.3 逻辑运算符

  逻辑运算符是对两个关系式或逻辑值进行运算的,运算结果仍是逻辑值。
在C语言中,逻辑值是用数值非0和0来表示逻辑真和假的,所以逻辑运算符也可以对两个数值型数据进行运算,包括整型、实型、字符型等数据。
  逻辑运算符的运算对象、运算规则与结果、结合性如表2-7和表2-8所示

  注意其中的&&是由2个"&"组成的,||是由2个"|"组成的。
  单目逻辑运算符(!)是前缀运算符,双目逻辑运算符是插在两个运算对象中间,所组成的表达式称为逻辑表达式。逻辑表达式的运算结果是逻辑值。若运算结果为逻辑真,则获得1;若运算结果是逻辑假,由获得0。
  要特别注意逻辑真的表示方法,对参加运算的逻辑真,是用非0值来表示的;而运算结果的逻辑真是用数值1来表示的。而对逻辑假,不管是参加运算,还是运算结果,都是用数值0来表示的。
  逻辑运算符的优先级如下:
   ·! 优先于 双目算术运算符 优先于 关系运算符 优先于 && 优先于 ||
   ·单目逻辑运算符!和单目算术运算符是同级别的,结合性是自右向左 
   ·双目逻辑运算符的结合性是自左向右
  请读者注意逻辑运算符的结合性。
   !的结合性是自右向左的,即先计算最右边的!,再依次向左计算其它的!。例如,    !!!10的计算顺序相当于!(!(!10)),结果为0。
&&和||的结合性是自左向右的,即先计算最左边的&&(或||),再依次向右计算其它的&&(或||)。例如,10&&1&&0的计算顺序相当于(10&&1)&&0,结果为0。又如,0||0||5的计算顺序相当于(0||0)||5,结果为1。
  还要提醒读者注意的是,用&&对两个表达式进行计算时,若第一个表达式的值为"假",则运算结果与第二个表达式的值无关,结果肯定为"假",所以C语言规定此时第二个表达式将不再计算。同样用||对两个表达式进行计算时,若第一个表达式的值为"真",则运算结果与第二个表达式的值无关,结果肯定为"真",所以C语言规定此时第二个表达式也不再计算。例如定义a为整型变量,则0&&(a++)的运算结果为0,a值不变;1||(a++)的运算结果为1,a值也不变。
  [例2-4]逻辑运算符的使用。
  设变量定义如下:char c1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
          int n1=65,n2=97;
          float f1=3.0,f2=3.0001;
  则:!c1的值是0 n1&&n2的值是1 f1||f2的值是1
  !(c2>c1)的值是1 !c2>c1的值是0 f1>f2||!c1的值是0
  n1+32==n2&&n1==c2的值是1

 2.4.4 赋值运算符

  赋值运算符分为三种:基本赋值运算符(简称赋值运算符)、算术自反赋值运算符、位自反赋值运算符。前两种在本小节介绍,第三种将在2.4.8小节中介绍。

 1.赋值运算符

  赋值运算符是双目运算符,赋值运算符的前面必须是变量,后面是表达式。
  赋值运算符的运算对象、运算规则与结果、结合性如表2-9所示。

  由于任何运算符和运算对象组成的式子都是表达式,所以由赋值运算符连接运算对象组成的式子"变量=表达式"也是表达式,称为赋值表达式。每个表达式都有值,所以赋值表达式也有值,其值等于赋值运算符右边表达式的值,也就赋予左边变量的那个值。
  赋值运算符的优先级如下:
   ·算术运算符 优先于 关系运算符 优先于双目逻辑运算符 优先于 赋值运算符
   ·赋值运算符的结合性是自右向左
  [例2-5]赋值运算符的使用。
  设变量定义如下:char c1='a',c2;(c1、c2可看成整型,c1的值97)
          int n1=65,n2,n3,n4,n5,n6;
          float f1=3.0,f2;
  则:c2=n1运算后c2的值是65,n1的值不变,表达式值为65
    n2=!c1运算后n2的值是0,c1的值不变,表达式值为0
    f2=f1+0.001运算后f2的值是3.001,f1的值不变,表达式值为3.001
    n3=c1==n1||c1!=n1运算后n3的值是1,c1和n1的值不变,表达式值为1
     注:运算顺序相当于n3=((c1= =n1)||(c1!=n1))
    n4=n5=n6=-(--n1)运算后n4、n5、n6的值均是-64,n1的值是64,表达式值为-64
     注:运算顺序相当于n4=(n5=(n6=-(--n1)))
  还要注意最后一个式子中的"-(--n1"不能写成"---n1",者表示"(--)-n1",由于运算符"--"只能作用于变量,所以会出现语法错误。

 2.算术自反赋值运算符

  算术自反赋值运算符是双目运算符,赋值运算符的前面必须是变量,后面是表达式。专用于将某个变量和表达式进行指定算术运算后的结果赋予该变量。
算术自反赋值运算符的运算对象、运算规则与结果、结合性如表2-10所示。

  算术自反赋值运算符的优先级如下:
   ·算术运算符 优先于 关系运算符 优先于 双目逻辑运算符 优先于 算术自反赋值运算符
   ·算术自反赋值运算符和赋值运算符是同级别的,结合性是自右向左

  注意,自反赋值运算符右边的表达式是由C语言编译系统自动加括号的。例如"c%=a-3"不能理解为"c=c%a-3",应该理解为"c=c%(a-3 )"。否则按运算符的优先级先算术"c%a",结果就不对了。
  由算术自反赋值运算符组成的式子也是表达式,其值为赋予左边变量的值。
  [例2-6]算术自反赋值运算符的使用。
  设变量定义如下:int n1=10,n2=10,n3=10,m1=10,m2=10,m3=10,m4=10;
  则:n1+=n2运算后,n1的值为20,n2的值不变,表达式值为20
    n1-=n2运算后,n1的值为0,n2的值不变,表达式值为0
    n1*=n2运算后,n1的值为100,n2的值不变,表达式值为100
    n1/=n2运算后,n1的值为1,n2的值不变,表达式值为1
    m1+=m2-=m3*=m4/=2运算后,m1、m2、m3、m4的值依次为-30、-40、50、5,表达式值为-30。注:运算顺序相当于m1+=(m2-=(m3*=m4/=2)))

 2.4.5逗号运算符

  逗号运算符是双目运算符,其运算对象是表达式。
  逗号运算符的运算对象、运算规则与结果、结合性如表2-11所示。

  注意,由逗号运算符组成的式子也是表达式,其值等于最右边的表达式的值。
  逗号运算符的优先级如下:
  ·任何运算符 优先于 逗号运算符
  ·逗号运算符的结合性是自左向右
  例如,设整型变量a、b为2,
  则:b=a+3,c=b+4
      结果a不变,b为5,c为9,表达式的值为9(c=b+4 的值)
    d=a--,e=d--,f=--e
      结果a为1,d为1,e为1,f为1,表达式的值为1(f=--e的值)

 2.4.6条件运算符

  条件运算符是三目运算符,它是由两个符号"?"和":"组合而成的。其三个运算对象都是表达式。第一个运算对象可以是任何类型的表达式,通常要按逻辑表达式来理解,后两个表达式是类型相同的任何表达式。
  条件运算符的运算对象,运算规则与结果、结合性如表2-12所示。

  条件运算符的优先级如下:
   ·其它运算符 优先于 条件运算符 优先于 赋值、算术自反赋值运算符
   ·条件运算符的结合性是自右向左
  用条件运算符构成的表达式称为条件表达式,其值与表达式1的值有关,若表达式1的值为非0(真),则条件表达式值等于表达式2的值;否则等于表达式3的值。
  例如,设整型变量a,b,c,d均为2
  则:a==b?(c=1):(d=0);结果a,b,c,d不变,c为1,表达式值为1
    注:运算顺序相当于(a= =b)?(c=1):(d=0),由于条件运算符优先于赋值运算符,所以(c=1)和(d=0)的圆括号不能少。
   A+1==3?(b=a+2):(c=a+3);结果a、c不变,b为4,表达式值为4
    注:运算顺序相当于((a+1)==3)?(b=(a+2)):(c=(a+3))
   a==b?(c=0):a>b?(c=1):(c=1);结果a、b不变,c为0,表达式值为0
    注:运算顺序相当于(a==b)?(c=0):((a>b)?(c=1):(c=-1))

 2.4.7长度运算符

  长度运算符是单目运算符,其运算对象可以是任何数据类型符或变量。注意,运算对象必须用圆括号括住。
  长度运算符的运算对象、运算规则与结果、结合性如表2-:13所示。

  长度运算符的优先级如下:
   ·和单目算术运算符、单目逻辑运算符、增1减1运算符同级别
   ·同级运算符的结合性是自右向左的
  [例2-:7]长度运算符的使用。
  设变量定义如下:int n;short s;unsigned long u3;float f;char c;
  则:sizeof(n)的值是2      sizeof(s)的值是2
    sizeof(long)的值是4     sizeof(unsigned int)的值是2
    sizeof(f)的值是4      sizeof(u3)的值是4
    sizeof(c)的值是1      sizeof(double)的值是8
  注意:上述结果是在奔腾Ⅱ微型机上运行的结果。

 2.4.8位运算符

  位运算是一种对运算对象按二进制位进行操作的运算。位运算不允许只操作其中的某一位,而是对整个数据按二进制位进行运算。例如,对一个字节的数据(字符型)进行位运算时,是同时对其中的8个二进制位进行运算;对两个字节的数据(短整型、无符号短整型)进行位运算时,是同时对其中的16个二进制位进行运算;对四个字节的数据(长整型、无符号短整型)进行位运算时,是同时对其中的16个二进制位进行运算;对四个字节的数据(长整型、无符号长整型)进行位运算时,是同时对其中的32个二进制位进行运算。
  位运算的对象只是能是整型数据(包括字符型);运算结果仍是整型数据。
  位运算符分为位逻辑运算符、位移位运算符和位自反赋值运算符三种。

 1.位逻辑运算符

  位逻辑运算符是将数据中每个二进制位的"0"或"1"看成逻辑值,逐位进行逻辑运算的运算符。位逻辑运算符分为非、与、或、接位加四种。"非"是单目前缀运算符,蓁三种都是双目运算符。
  位逻辑运算符的运算对象、运算规则与结果、结合性如表2-14所示。

  位逻辑运算符的优先级如下:
   ·~ 优先于 算术运算符 优先于 关系运算符 优先于 & 优先于 ^ 优先于 | 优先于 双目逻辑运算符
   ·~和单目的逻辑、增1减1、算术、长度运算符是同级别的,结合性是自右向左
  例如,设a、b均为无符号短整型变量:
     a为0111(对应二进制数为0000000001001001)
     b为0123(对应二进制数为0000000001010011)
  则: ~a 结果为0177666(对应二进制数为1111111110110110),a不变
     a&b 结果为0101(对应二进制数为0000000001000001),a、b不变
     a|b 结果为0133(对应二进制数为0000000001011011),a、b不变
     a^b 结果为032(对应二进制数为 0000000000011010),a、b不变

 2.位移位运算符

  位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
  位移位运算符的运算对象、运算规则与结果、结合性如表2-16所示。

  移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。具体移位规则如下所示。

  位移位运算符的优先级如下:
   ·算术运算符 优先于 位移位运算符 优先于 关系运算符
   ·位移位运算符是同级别的,结合性是自左向右
  例如,设无符号短整型变量a为0111(对应二进制数为0000000001001001),
   则:a<<3 结果为01110(对应二进制数为0000001001001000),a不变
     a>>4 结果为04 (对应二进制数为0000000000000100),a不变
  又如,设短整型变量a为-4(对应二进制数为1111111111111100),
   则:a<<3 结果为-32(对应二进制数为1111111111100000),a不变
     a>>4 结果为-1(对应二进制数为1111111111111111),a不变

 3.自反赋值运算符

  位自反赋值运算符是双目运算符,前面必须是变量,后面是表达式。
  位自反赋值运算符的运算对象、运算规则与结果、结合性如表2-17所示。

  位自反赋值运算符的优先级如下:
   ·条件运算符 优先于 位自反赋值运算符
   ·位自反赋值运算符和赋值运算符、算术自反赋值运算符是同级的
   ·同级赋值运算符的结合性是自右向左
  由位自反赋值运算符组成的式子称为位自反赋值表达式,其值等于赋予左边变量的值。
  例如,设无符号整型变量a为6,b为3,
  则:b&=a  相当于是b=b&(a),结果a不变,b为2,表达式值为2
    b|=a  相当于b=b|(a),结果a不变,b为7,表达式值为7
    b^=a  相当于b=b^(a),结果a 不变,b为5,表达式值为5
    a<<=b  相当于a=a<<(b),结果b不变,a为48,表达式值为48
    a>>=b  相当于a=a>>(b),结果b不变,a为0,表达式值为0
  前面分别介绍了基本运算符及其运算规则、优先级别、结合性。关于C语言中所有运算符的优先级别和结合性请参见附录二。

以下是使用二叉树计逻辑公式的Python代码: ```python class Node: def __init__(self, val): self.val = val self.left = None self.right = None def build_expression_tree(expression): stack = [] for char in expression: if char == ' ': continue elif char == '(': stack.append(char) elif char == ')': while stack[-1] != '(': right = stack.pop() op = stack.pop() left = stack.pop() node = Node(op) node.left = left node.right = right stack.append(node) stack.pop() elif char in ['&', '|', '!']: stack.append(char) else: node = Node(char) stack.append(node) while len(stack) > 1: right = stack.pop() op = stack.pop() left = stack.pop() node = Node(op) node.left = left node.right = right stack.append(node) return stack[0] def evaluate(root, variables): if root.val in ['&', '|']: left_val = evaluate(root.left, variables) right_val = evaluate(root.right, variables) if root.val == '&': return left_val and right_val else: return left_val or right_val elif root.val == '!': return not evaluate(root.right, variables) else: return variables[root.val] expression = "(a & b) | (!a & c)" variables = {'a': True, 'b': False, 'c': True} root = build_expression_tree(expression) print(evaluate(root, variables)) # Output: True ``` 该代码实现了将缀形式的逻辑公式转换为后缀形式,并根据后缀形式构建二叉树。在计逻辑公式的真值时,可利用后序遍历二叉树的方式,递归计每个子树的值,并根据当前节点的当前子树的值。最终得到逻辑公式的真值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值