Hoe wordt dit geévalueert

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Stel je hebt dit.

code:
1
2
3
4
5
6
bool bTest = true;

if (!bTest==false) 
  {
  // iest
  }


Het is altijd true.

Als !bTest eerst wordt bekeken dan is het true.

Als het wordt bekeken als !(bTest==false) dan is het ook true.

Maar welke van de twee is nou de juiste.

Ik weet dat je ook if (!bTest) kan gebruiken maar daar gaat het ff niet om.

Noushka's Magnificent Dream | Unity


  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
'!' Heeft bijna de hoogste prioriteit van ALLE operatoren. Het wordt dus gezien als (!bTest)==false

Dit had je in eender welk boek over C of C++ kunnen vinden hoor.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier een lijst van de prioriteiten zoals die gelden in alle C achtige talen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  ....
  >
    {right:
      Expr "++" -> Expr
      Expr "--" -> Expr
    }
  > {right:
      "++" Expr -> Expr
      "--" Expr -> Expr
      "+"  Expr -> Expr
      "-"  Expr -> Expr
      "~"  Expr -> Expr
      "!"  Expr -> Expr
      "(" Type ")" Expr -> Expr
    }
  > {left:
      Expr "*" Expr -> Expr
      Expr "/" Expr -> Expr
      Expr "%" Expr -> Expr
    } 
  > {left:
      Expr "+" Expr -> Expr
      Expr "-" Expr -> Expr
    }
  > {left:
      Expr "<<"  Expr -> Expr
      Expr ">>"  Expr -> Expr
      Expr ">>>" Expr -> Expr
    }
  > {left:
      Expr "instanceof" RefType -> Expr
      Expr "<"   Expr -> Expr
      Expr ">"   Expr -> Expr
      Expr "<="  Expr -> Expr
      Expr ">="  Expr -> Expr
    }
  > {left:
      Expr "=="  Expr -> Expr
      Expr "!="  Expr -> Expr
    }
  >   Expr "&"   Expr -> Expr
  >   Expr "^"   Expr -> Expr
  >   Expr "|"   Expr -> Expr
  >   Expr "&&"  Expr -> Expr
  >   Expr "||"  Expr -> Expr
  >   Expr "?" Expr ":" Expr -> Expr
  > {right:
      LHS "="    Expr -> Expr
      LHS "*="   Expr -> Expr
      LHS "/="   Expr -> Expr
      LHS "%="   Expr -> Expr
      LHS "+="   Expr -> Expr
      LHS "-="   Expr -> Expr
      LHS "<<="  Expr -> Expr
      LHS ">>="  Expr -> Expr
      LHS ">>>=" Expr -> Expr
      LHS "&="   Expr -> Expr
      LHS "^="   Expr -> Expr
      LHS "|="   Expr -> Expr
    }


Je zit dus dat het ! een veel hogere prioriteit heeft dan de vergelijking. Deze ! neemt dus als eerste z'n argumenten wat dus zorgt voor ((!bTest) == false).

Overigens kan je in geval van twijfel altijd beter wel haakjes zetten.

Overigens is (b == false) of (b == true) een onzinnige vergelijking. Beter en duidelijker is dan simpelweg !b of b te gebruiken als conditie.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment