파생 작업Side Effects

식의 계산 순서는 언어에서 특정 계산 순서를 보장하는 경우(우선 순위 및 계산 순서 참조)를 제외하고 특정 구현에서 정의됩니다.The order of evaluation of expressions is defined by the specific implementation, except when the language guarantees a particular order of evaluation (as outlined in Precedence and Order of Evaluation). 예를 들어 다음 함수 호출에서 의도하지 않은 결과가 발생합니다.For example, side effects occur in the following function calls:

add( i + 1, i = j + 2 );  
myproc( getc(), getc() );  

함수 호출의 인수는 어떤 순서로든 계산될 수 있습니다.The arguments of a function call can be evaluated in any order. i + 1 식이 i = j + 2보다 먼저 계산되거나, i = j + 2i + 1보다 먼저 계산될 수 있습니다.The expression i + 1 may be evaluated before i = j + 2, or i = j + 2 may be evaluated before i + 1. 각 경우에 결과가 다릅니다.The result is different in each case. 마찬가지로 myproc에 실제로 전달되는 문자를 보장할 수 없습니다.Likewise, it is not possible to guarantee what characters are actually passed to the myproc. 단항 증가 및 감소 연산에는 할당이 포함되므로 이러한 연산은 다음 예제와 같이 의도하지 않은 결과를 발생시킬 수 있습니다.Since unary increment and decrement operations involve assignments, such operations can cause side effects, as shown in the following example:

x[i] = i++;  

이 예제에서 수정되는 x의 값은 예측할 수 없습니다.In this example, the value of x that is modified is unpredictable. 첨자의 값은 i의 새 값이거나 이전 값일 수 있습니다.The value of the subscript could be either the new or the old value of i. 결과는 컴파일러나 최적화 수준에 따라 달라질 수 있습니다.The result can vary under different compilers or different optimization levels.

C에서는 의도하지 않은 결과에 대한 계산 순서를 정의하지 않으므로 위에서 설명한 두 계산 방법 모두 올바르며 둘 중 하나가 구현될 수 있습니다.Since C does not define the order of evaluation of side effects, both evaluation methods discussed above are correct and either may be implemented. 코드가 이식 가능하고 명확하도록 하려면 의도하지 않은 결과에 대한 특정 계산 순서에 의존하는 문을 사용하지 않아야 합니다.To make sure that your code is portable and clear, avoid statements that depend on a particular order of evaluation for side effects.

참고 항목See Also

식 계산Expression Evaluation