Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      C++ Operator Precedence

      From cppreference.com
      <cpp‎ |language
       
       
      C++ language
      General topics
      Flow control
      Conditional execution statements
      Iteration statements (loops)
      Jump statements
      Functions
      Function declaration
      Lambda function expression
      inline specifier
      Dynamic exception specifications(until C++17*)
      noexcept specifier(C++11)
      Exceptions
      Namespaces
      Types
      Specifiers
      constexpr(C++11)
      consteval(C++20)
      constinit(C++20)
      Storage duration specifiers
      Initialization
      Expressions
      Operators
      Operator precedence
      Alternative representations
      Literals
      Boolean -Integer -Floating-point
      Character -String -nullptr(C++11)
      User-defined(C++11)
      Utilities
      Attributes(C++11)
      Types
      typedef declaration
      Type alias declaration(C++11)
      Casts
      Memory allocation
      Classes
      Class-specific function properties
      Special member functions
      Templates
      Miscellaneous
       
      Expressions
      General
      Literals
      Operators
      Conversions
       

      The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.a,b andc are operands.

      PrecedenceOperatorDescriptionAssociativity
      1a::bScope resolutionLeft-to-right →
      2a++ a--Suffix/postfixincrement and decrement
      type(a) type{a}Functional cast
      a()Function call
      a[]Subscript
      a.b a->bMember access
      3++a --aPrefixincrement and decrementRight-to-left ←
      +a -aUnaryplus and minus
      !a ~aLogical NOT andbitwise NOT
      (type)aC-style cast
      *aIndirection (dereference)
      &aAddress-of
      sizeofSize-of[note 1]
      co_awaitawait-expression(C++20)
      new – new[]Dynamic memory allocation
      delete – delete[]Dynamic memory deallocation
      4a.*b a->*bPointer-to-memberLeft-to-right →
      5a* b a/ b a% bMultiplication, division, and remainder
      6a+ b a- bAddition and subtraction
      7a<< b a>> bBitwiseleft shift and right shift
      8a<=> bThree-way comparison operator(since C++20)
      9a< b a<= b a> b a>= bForrelational operators< and<= and> and>= respectively
      10a== b a!= bForequality operators= and!= respectively
      11a& bBitwise AND
      12a^ bBitwise XOR (exclusive or)
      13a| bBitwise OR (inclusive or)
      14a&& bLogical AND
      15a|| bLogical OR
      16a? b: cTernary conditional[note 2]Right-to-left ←
      throwthrow operator
      co_yieldyield-expression(C++20)
      a= bDirect assignment (provided by default for C++ classes)
      a+= b a-= bCompound assignment by sum and difference
      a*= b a/= b a%= bCompound assignment by product, quotient, and remainder
      a<<= b a>>= bCompound assignment by bitwise left shift and right shift
      a&= b a^= b a|= bCompound assignment by bitwise AND, XOR, and OR
      17a, bCommaLeft-to-right →
      1. The operand ofsizeof cannot be a C-style type cast: the expressionsizeof(int)* p is unambiguously interpreted as(sizeof(int))* p, but notsizeof((int)*p).
      2. The expression in the middle of the conditional operator (between? and:) is parsed as if parenthesized: its precedence relative to?: is ignored.

      When parsing an expression, an operator which is listed on some row of the table above with a precedence will be bound tighter (as if by parentheses) to its arguments than any operator that is listed on a row further below it with a lower precedence. For example, the expressionsstd::cout<< a& b and*p++ are parsed as(std::cout<< a)& b and*(p++), and not asstd::cout<<(a& b) or(*p)++.

      Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expressiona= b= c is parsed asa=(b= c), and not as(a= b)= c because of right-to-left associativity of assignment, buta+ b- c is parsed(a+ b)- c and nota+(b- c) because of left-to-right associativity of addition and subtraction.

      Associativity specification is redundant for unary operators and is only shown for completeness: unary prefix operators always associate right-to-left (delete++*p isdelete(++(*p))) and unary postfix operators always associate left-to-right (a[1][2]++ is((a[1])[2])++). Note that the associativity is meaningful for member access operators, even though they are grouped with unary postfix operators:a.b++ is parsed(a.b)++ and nota.(b++).

      Operator precedence is unaffected byoperator overloading. For example,std::cout<< a? b: c; parses as(std::cout<< a)? b: c; because the precedence of arithmetic left shift is higher than the conditional operator.

      [edit]Notes

      Precedence and associativity are compile-time concepts and are independent fromorder of evaluation, which is a runtime concept.

      The standard itself doesn't specify precedence levels. They are derived from the grammar.

      const_cast,static_cast,dynamic_cast,reinterpret_cast,typeid,sizeof...,noexcept andalignof are not included since they are never ambiguous.

      Some of the operators havealternate spellings (e.g.,and for&&,or for||,not for!, etc.).

      In C, the ternary conditional operator has higher precedence than assignment operators. Therefore, the expressione= a< d? a++: a= d, which is parsed in C++ ase=((a< d)?(a++):(a= d)), will fail to compile in C due to grammatical or semantic constraints in C. See the corresponding C page for details.

      [edit]See also

      Common operators
      assignmentincrement
      decrement
      arithmeticlogicalcomparisonmember
      access
      other

      a= b
      a+= b
      a-= b
      a*= b
      a/= b
      a%= b
      a&= b
      a|= b
      a^= b
      a<<= b
      a>>= b

      ++a
      --a
      a++
      a--

      +a
      -a
      a+ b
      a- b
      a* b
      a/ b
      a% b
      ~a
      a& b
      a| b
      a^ b
      a<< b
      a>> b

      !a
      a&& b
      a|| b

      a== b
      a!= b
      a< b
      a> b
      a<= b
      a>= b
      a<=> b

      a[...]
      *a
      &a
      a->b
      a.b
      a->*b
      a.*b

      function call

      a(...)
      comma

      a, b
      conditional

      a? b: c
      Special operators

      static_cast converts one type to another related type
      dynamic_cast converts within inheritance hierarchies
      const_cast adds or removescv-qualifiers
      reinterpret_cast converts type to unrelated type
      C-style cast converts one type to another by a mix ofstatic_cast,const_cast, andreinterpret_cast
      new creates objects with dynamic storage duration
      delete destructs objects previously created by the new expression and releases obtained memory area
      sizeof queries the size of a type
      sizeof... queries the size of apack(since C++11)
      typeid queries the type information of a type
      noexcept checks if an expression can throw an exception(since C++11)
      alignof queries alignment requirements of a type(since C++11)

      C documentation forC operator precedence
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/operator_precedence&oldid=178769"

      [8]ページ先頭

      ©2009-2025 Movatter.jp