우선 순위 및 식 평가 순서Precedence and Order of Evaluation

C 연산자의 우선 순위와 결합성은 식의 피연산자 그룹화 및 계산에 영향을 줍니다.The precedence and associativity of C operators affect the grouping and evaluation of operands in expressions. 연산자의 우선 순위는 우선 순위가 더 높거나 낮은 다른 연산자가 있는 경우에만 의미가 있습니다.An operator's precedence is meaningful only if other operators with higher or lower precedence are present. 우선 순위가 높은 연산자가 있는 식이 먼저 계산됩니다.Expressions with higher-precedence operators are evaluated first. 우선 순위는 단어 "바인딩"으로도 설명할 수 있습니다.Precedence can also be described by the word "binding." 우선 순위가 높은 연산자는 더욱 엄격한 바인딩을 가져야 합니다.Operators with a higher precedence are said to have tighter binding.

다음 표는 C 연산자의 우선 순위(피연산자 계산 순서)와 결합성을 우선 순위가 높은 것부터 낮은 것 순서로 나열 및 요약한 것입니다.The following table summarizes the precedence and associativity (the order in which the operands are evaluated) of C operators, listing them in order of precedence from highest to lowest. 여러 개의 연산자가 함께 표시된 경우, 해당 연산자는 우선 순위가 같으므로 각각의 연관성에 따라 계산됩니다.Where several operators appear together, they have equal precedence and are evaluated according to their associativity. 표에 나온 연산자는 후위 연산자를 처음에 다루는 단원에 설명되어 있습니다.The operators in the table are described in the sections beginning with Postfix Operators. 이 단원의 나머지 부분에서는 우선 순위 및 결합성에 대한 일반적인 정보를 제공합니다.The rest of this section gives general information about precedence and associativity.

C 연산자의 우선 순위 및 결합성Precedence and Associativity of C Operators

Symbol1Symbol1 연산 형식Type of Operation associativityAssociativity
. -> 후위 ++ 및 후위 -- . -> postfix ++ and postfix -- Expression 왼쪽에서 오른쪽Left to right
전위 ++ 및 전위 -- sizeof & * + - ~ !prefix ++ and prefix -- sizeof & * + - ~ ! 단항Unary 오른쪽에서 왼쪽Right to left
형식 캐스팅typecasts 단항Unary 오른쪽에서 왼쪽Right to left
* / %* / % 곱하기Multiplicative 왼쪽에서 오른쪽Left to right
+ -+ - 더하기Additive 왼쪽에서 오른쪽Left to right
<< >> 비트 시프트Bitwise shift 왼쪽에서 오른쪽Left to right
< > <= >=< > <= >= 관계Relational 왼쪽에서 오른쪽Left to right
== !=== != 같음Equality 왼쪽에서 오른쪽Left to right
& 비트 ANDBitwise-AND 왼쪽에서 오른쪽Left to right
^ 비트 제외 ORBitwise-exclusive-OR 왼쪽에서 오른쪽Left to right
|| 비트 포함 ORBitwise-inclusive-OR 왼쪽에서 오른쪽Left to right
&& 논리 ANDLogical-AND 왼쪽에서 오른쪽Left to right
&#124;&#124; 논리 ORLogical-OR 왼쪽에서 오른쪽Left to right
? :? : 조건식Conditional-expression 오른쪽에서 왼쪽Right to left
= *= /= %== *= /= %=

+= -= <<= >>=&=+= -= <<= >>=&=

^= |=^= |=
단순 및 복합 할당2Simple and compound assignment2 오른쪽에서 왼쪽Right to left
,, 순차적 계산Sequential evaluation 왼쪽에서 오른쪽Left to right
  1. 연산자는 내림차순 우선 순위로 나열됩니다.Operators are listed in descending order of precedence. 여러 연산자가 같은 줄 또는 그룹에 표시된 경우, 해당 연산자는 우선 순위가 같습니다.If several operators appear on the same line or in a group, they have equal precedence.

  2. 모든 단순 및 복합 할당 연산자의 우선 순위는 같습니다.All simple and compound-assignment operators have equal precedence.

    식에 우선 순위가 같은 여러 연산자가 포함될 수 있습니다.An expression can contain several operators with equal precedence. 여러 연산자가 하나의 식에 같은 수준으로 표시된 경우, 오른쪽에서 왼쪽 또는 왼쪽에서 오른쪽으로 연산자의 연관성에 따라 계산이 진행됩니다.When several such operators appear at the same level in an expression, evaluation proceeds according to the associativity of the operator, either from right to left or from left to right. 계산의 방향은 같은 수준에 있는 곱하기(\), 더하기(+) 또는 이진 비트(& | ^) 연산자가 둘 이상 포함된 식의 결과에 영향을 주지 않습니다.The direction of evaluation does not affect the results of expressions that include more than one multiplication (**), addition (+), or binary-bitwise (& | ^**) operator at the same level. 연산 순서는 언어에 따라 정의되지 않습니다.Order of operations is not defined by the language. 컴파일러는 일관된 결과를 보장할 수 있는 경우 어떠한 순서로든 이러한 식을 자유롭게 계산합니다.The compiler is free to evaluate such expressions in any order, if the compiler can guarantee a consistent result.

    순차적 계산(,), 논리적 AND(&&), 논리적 OR(||), 조건식(? :) 및 함수 호출 연산자만 시퀀스 위치를 구성하므로 피연산자에 대한 특정 계산 순서를 보장합니다.Only the sequential-evaluation (,), logical-AND (&&), logical-OR (||), conditional-expression (? :), and function-call operators constitute sequence points and therefore guarantee a particular order of evaluation for their operands. 함수 호출 연산자는 함수 식별자 뒤에 오는 괄호의 집합입니다.The function-call operator is the set of parentheses following the function identifier. 순차적 계산 연산자(,)는 피연산자를 왼쪽에서 오른쪽으로 계산합니다.The sequential-evaluation operator (,) is guaranteed to evaluate its operands from left to right. 함수 호출의 쉼표 연산자는 순차적 계산 연산자와 동일하지 않으며 동일하다는 보장도 제공하지 않습니다. 자세한 내용은 시퀀스 위치를 참조하세요.(Note that the comma operator in a function call is not the same as the sequential-evaluation operator and does not provide any such guarantee.) For more information, see Sequence Points.

    논리 연산자도 피연산자를 왼쪽에서 오른쪽으로 계산합니다.Logical operators also guarantee evaluation of their operands from left to right. 하지만 식의 결과를 결정하는 데 필요한 최소 피연산자 수를 계산합니다.However, they evaluate the smallest number of operands needed to determine the result of the expression. 이것을 "단락(short-circuit)" 계산이라고 합니다.This is called "short-circuit" evaluation. 따라서 식의 일부 피연산자는 계산될 수 없습니다.Thus, some operands of the expression may not be evaluated. 예를 들어, 식에서For example, in the expression

x && y++  

두 번째 피연산자, y++x가 true(0 이외의 값)인 경우에만 계산됩니다.the second operand, y++, is evaluated only if x is true (nonzero). 따라서 yx가 false(0)인 경우 증가하지 않습니다.Thus, y is not incremented if x is false (0).

예제Examples

다음 목록에서는 컴파일러가 자동으로 몇 가지 예제 식을 바인딩하는 방법을 보여 줍니다.The following list shows how the compiler automatically binds several sample expressions:

Expression 자동 바인딩Automatic Binding
a & b &#124;&#124; c (a & b) &#124;&#124; c
a = b &#124;&#124; c a = (b &#124;&#124; c)
q && r &#124;&#124; s-- (q && r) &#124;&#124; s--

첫 번째 식에서 비트 AND 연산자(&)는 논리 OR 연산자(||)보다 우선 순위가 높기 때문에 a & b가 논리 OR 연산의 첫 번째 피연산자가 됩니다.In the first expression, the bitwise-AND operator (&) has higher precedence than the logical-OR operator (||), so a & b forms the first operand of the logical-OR operation.

두 번째 식에서 논리 OR 연산자(||)는 단순 할당 연산자(=)보다 우선 순위가 높습니다. 따라서 b || c는 할당에서 오른쪽 피연산자 그룹이 됩니다.In the second expression, the logical-OR operator (||) has higher precedence than the simple-assignment operator (=), so b || c is grouped as the right-hand operand in the assignment. a에 할당되는 값은 0 또는 1입니다.Note that the value assigned to a is either 0 or 1.

세 번째 식은 예기치 않은 결과가 발생할 수 있는 올바른 식을 보여 줍니다.The third expression shows a correctly formed expression that may produce an unexpected result. 논리 AND 연산자(&&)는 논리 OR 연산자(||)보다 우선 순위가 높기 때문에 q && r은 단일 피연산자 그룹이 됩니다.The logical-AND operator (&&) has higher precedence than the logical-OR operator (||), so q && r is grouped as an operand. 논리 연산자는 피연산자가 왼쪽에서 오른쪽으로 계산되도록 보장하므로 q && rs--보다 먼저 계산됩니다.Since the logical operators guarantee evaluation of operands from left to right, q && r is evaluated before s--. 그러나 q && r이 0 이외의 값으로 계산되는 경우, s--는 계산되지 않고 s는 줄어들지 않습니다.However, if q && r evaluates to a nonzero value, s-- is not evaluated, and s is not decremented. s가 줄어들지 않아 프로그램에 문제가 발생할 경우 s--가 식의 첫째 피연산자로 표시되거나 s가 별도 연산에서 감소됩니다.If not decrementing s would cause a problem in your program, s-- should appear as the first operand of the expression, or s should be decremented in a separate operation.

다음 식은 잘못되었으며 컴파일 시 진단 메시지를 생성합니다.The following expression is illegal and produces a diagnostic message at compile time:

잘못된 식Illegal Expression 기본 그룹화Default Grouping
p == 0 ? p += 1: p += 2 ( p == 0 ? p += 1 : p ) += 2

이 식에서는 같음 연산자(==)의 우선 순위가 가장 높으므로 p == 0은 피연산자 그룹이 됩니다.In this expression, the equality operator (==) has the highest precedence, so p == 0 is grouped as an operand. 조건식 연산자(? :)의 우선 순위는 그 다음으로 높습니다.The conditional-expression operator (? :) has the next-highest precedence. 첫 번째 피연산자는 p == 0이고, 두 번째 피연산자는 p += 1입니다.Its first operand is p == 0, and its second operand is p += 1. 그러나 p가 복합 할당 연산자보다 조건식 연산자에 더 가까이 바인딩되기 때문에 마지막 조건식 연산자의 피연산자는 p += 2가 아닌 p로 간주됩니다.However, the last operand of the conditional-expression operator is considered to be p rather than p += 2, since this occurrence of p binds more closely to the conditional-expression operator than it does to the compound-assignment operator. += 2에 왼쪽 피연산자가 없기 때문에 구문 오류가 발생합니다.A syntax error occurs because += 2 does not have a left-hand operand. 이러한 종류의 오류를 방지하고 보다 읽기 쉬운 코드를 생성하려면 괄호를 사용해야 합니다.You should use parentheses to prevent errors of this kind and produce more readable code. 예를 들어, 아래와 같이 괄호를 사용하여 앞의 예제를 수정하고 명확하게 만들 수 있습니다.For example, you could use parentheses as shown below to correct and clarify the preceding example:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )  

참고 항목See Also

C 연산자C Operators