우선 순위 및 계산 순서
우선 순위와 결합성 C 연산자를 그룹화 하 고 식에서 피연산자의 평가 영향을 줍니다.연산자의 우선 순위가 다른 연산자를 더 높은 또는 낮은 우선 순위가 있는 경우만 의미가 있습니다.식은 사용 하 여 우선 순위가 높은 연산자가 먼저 계산 됩니다.우선 단어 "제본으로."도 설명 될 수 있습니다. 연산자는 우선 순위가 높은 바인딩이 밀접 하 게 된다고 합니다.
다음 표에서 우선 순위와 결합성 요약 (피연산자 계산 순서)의 C 연산자의 우선 순위가 가장 높은 것에서 낮은 화하여.여러 연산자를 함께 표시 하는 경우는 우선 순위가 같습니다과 연관성에 따라 평가 됩니다.연산자 테이블의 시작 부분에 설명 되어 후 위 연산자.이 섹션의 나머지 우선 순위와 결합성에 대 한 일반 정보를 제공합니다.
우선 순위 및 결합성을 C 연산자
Symbol1 |
작업의 종류 |
결합성 |
---|---|---|
[ ] ( ) . -> 후 위 ++ 및 후 위 - |
식 |
왼쪽에서 오른쪽 |
접두사 ++ 와 접두사 -sizeof & * + – ~! |
단항 |
오른쪽에서 왼쪽 |
typecasts |
단항 |
오른쪽에서 왼쪽 |
* / % |
승제 |
왼쪽에서 오른쪽 |
+ – |
가감 |
왼쪽에서 오른쪽 |
<< >> |
비트 시프트 |
왼쪽에서 오른쪽 |
< > <> = = |
관계형 |
왼쪽에서 오른쪽 |
== != |
같음 |
왼쪽에서 오른쪽 |
& |
비트-고 |
왼쪽에서 오른쪽 |
^ |
비트 배타적 논리합 |
왼쪽에서 오른쪽 |
| |
-포괄-OR |
왼쪽에서 오른쪽 |
&& |
논리적으로 하 고 |
왼쪽에서 오른쪽 |
|| |
논리적 OR |
왼쪽에서 오른쪽 |
?: |
조건식 |
오른쪽에서 왼쪽 |
= *= /= %= + =-= <> = = 및 = ^= |= |
단순 및 복합 assignment2 |
오른쪽에서 왼쪽 |
, |
순차 평가 |
왼쪽에서 오른쪽 |
1.연산자의 우선 순위가 내림차순으로 나열 됩니다.그룹에 여러 명의 연산자 같은 줄에 표시 하는 경우는 우선을 순위가 같습니다.
2.모든 단순 및 복합 할당 연산자 우선을 순위가 같습니다.
식에 우선 순위가 같은 여러 연산자를 포함할 수 있습니다.와 같은 여러 명의 연산자는 식에서 같은 수준에 표시 하는 경우 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로, 연산자의 연관성에 따라 평가 진행 합니다.평가의 방향을 곱하기 두 개 이상 포함 하는 식의 결과 영향을 미치는 (*), 더하기 (+), 또는 이진수 비트 (및 | ^) 같은 수준의 연산자입니다.작업의 순서는 언어에서 정의 되지 않았습니다.컴파일러는 일관 된 결과 보장할 수 있는 경우 컴파일러 임의의 순서로 이러한 식을 계산할 수 있습니다.
만 순차적으로 평가 (,), 논리-와 (& &), 논리적 OR (||), 조건식 (? :), 및 함수 호출 연산자 시퀀스 위치를 구성 하 고 따라서 특정 순서 대로 해당 피연산자에 대 한 평가 보장 합니다.함수 호출 연산자 함수 식별자 뒤 괄호 집합입니다.평가 순차 연산자 (,)는 피연산자가 왼쪽에서 오른쪽으로 평가 하도록 보장 됩니다.(쉼표 연산자 함수 호출에서 순차 평가 운영자 수 없습니다 하 고 그러한 보증을 제공 하지 않습니다 참고.) 자세한 내용은 시퀀스 위치.
논리 연산자는 또한 오른쪽으로 왼쪽에서 피연산자의 평가 보장합니다.가장 작은 숫자는 식의 결과 확인 하는 데 필요한 피연산자의 평가.이것을 "단락" 계산 이라고 합니다.따라서 일부 피연산자의 식 평가할 수 있습니다.예를 들어, 식에
x && y++
두 번째 피연산자 y++, 경우에 평가 됩니다 x 입니다 true (0이 아닌 값)입니다.따라서, y 경우는 증가 하지 않습니다 x false (0)입니다.
예제
다음은 컴파일러의 몇 가지 예제 식 자동으로 바인딩하는 방법을 보여 줍니다.
식 |
자동 바인딩 |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
첫 번째 식에서 비트-및 연산자 (&) 논리적 OR 연산자 보다 우선 순위가 높습니다 (||)에 다음과 같은 a & b 논리 OR 연산의 첫 번째 피연산자를 형성 합니다.
두 번째 식에서는 논리 OR 연산자 (||) 단순 대입 연산자 보다 우선 순위가 높습니다 (=)에 다음과 같은 b || c 할당에 오른쪽 피연산자와 그룹화 됩니다.값을 할당 a 은 0 또는 1입니다.
세 번째 식 예기치 않은 결과가 발생할 수 있습니다 하는 올바른 형식의 식을 보여 줍니다.논리-및 연산자 (&&) 논리 OR 연산자 보다 우선 순위가 높습니다 (||)에 다음과 같은 q && r 는 피연산자를 그룹화 됩니다.논리 연산자는 피연산자의 평가 왼쪽에서 오른쪽으로 보장 되므로 q && r 하기 전에 평가 하는 s––.그러나 경우 q && r 0이 아닌 값으로 계산 되 s–– 계산 됩니다 및 s 이 줄어들지 않습니다.감소 시키는 않는 경우 s 프로그램에 문제가 발생할 s–– 식의 첫 번째 피연산자로 나타날 또는 s 별도 작업으로 감소 될 합니다.
다음 식을 법적 이며 컴파일 시 진단 메시지 생성:
식이 잘못 되었습니다. |
기본 그룹 |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
이 식에서 같음 연산자 (==) 우선 순위가 가장 높은, 따라서 p == 0 는 피연산자를 그룹화 합니다.조건식 연산자 (? :) 다음 가장 높은 우선 순위를 가집니다.첫 번째 피연산자는 p == 0, 및 두 번째 피연산자는 p += 1.그러나 마지막 피연산자는 조건식 연산자의 간주 됩니다 p 대신 p += 2,이 항목의 이후 p 복합 할당 연산자를 보다는 조건식 연산자 보다 세밀 하 게 바인딩합니다.구문 오류 때문에 발생 += 2 왼쪽 피연산자가 없습니다.이러한 종류의 오류를 방지 하 고 보다 읽기 쉬운 코드를 생성 하려면 괄호를 사용 해야 합니다.예를 들어, 괄호 안에 아래와 같이 수정 하 고 앞의 예제를 명확 하 게 사용 하면 수 있습니다.
( p == 0 ) ? ( p += 1 ) : ( p += 2 )