developer tip

여러 조건이있는 if의 실행 순서

optionbox 2021. 1. 6. 08:04
반응형

여러 조건이있는 if의 실행 순서


여러 조건문이있는 if 문에서 첫 번째 결과가 분명하면 두 번째 조건문이 실행됩니까?

예:

if(i>0 && array[i]==0){
}

조건문을 바꾸면 i의 음수 값에 대해 segfault가 발생할 수 있지만 이렇게하면 segfault가 발생하지 않습니다. 이것이 항상 작동하는지 또는 중첩 된 if 문을 사용해야한다고 확신 할 수 있습니까?


이러한 유형의 평가를 단락 이라고 합니다. 결과가 100 % 명확하면 평가를 계속하지 않습니다.

이것은 실제로 일반적인 프로그래밍 기술입니다. 예를 들어 C ++에서는 다음과 같은 내용이 자주 표시됩니다.

if (pX!=null && pX->predicate()) { bla bla bla }

조건의 순서를 변경 한 경우 널 포인터에서 메서드를 호출하고 충돌 할 수 있습니다. C의 유사한 예제는 해당 구조체에 대한 포인터가있을 때 구조체의 필드를 사용합니다.

또는 다음과 유사한 작업을 수행 할 수 있습니다.

if(px==null || pX->isEmpty()} { bla bla bla }

이것은 또한 if 조건에서 부작용을 피하는 것이 일반적으로 좋은 생각 중 하나입니다.

예를 들어 다음이 있다고 가정합니다.

if(x==4 && (++y>7) && z==9)

경우 x이며 4, 다음 y에 관계없이 값의 증가합니다 z또는 y만하면 x되지 4, 그것은 전혀 증가되지 않습니다.


연산자 &&||오른쪽 전에 왼쪽 표현이 완벽하게 평가됩니다 (모든 부작용 적용) 보장이 평가된다. 즉, 연산자는 시퀀스 포인트를 도입합니다.

또한 lhs에서 식의 값을 결정할 수있는 경우 rhs는 평가되지 않습니다. 즉,와 같은 표현식이 x && y있고 x가 0 (거짓)으로 평가되면 표현식의 값은 y에 관계없이 거짓이므로 y는 평가되지 않습니다.

이는 시퀀스 포인트를 도입하기 x++ && x++때문에 다음 과 같은 표현식 이 잘 정의되어 있음을 의미합니다 &&.


초안 3485 (n3485.pdf)에서

5.14 논리 AND 연산자 [expr.log.and]

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
  1. && 연산자 그룹은 왼쪽에서 오른쪽 입니다. 피연산자는 모두 상황에 따라 bool로 변환됩니다 (Clause 4). 두 피연산자가 모두 참이면 결과는 참이고 그렇지 않으면 거짓입니다. &와 달리 &&는 왼쪽에서 오른쪽으로 평가를 보장 합니다. 첫 번째 피연산자가 거짓이면 두 번째 피연산자가 평가되지 않습니다.
  2. 결과는 부울입니다. 두 번째식이 평가되면 첫 번째 식과 관련된 모든 값 계산 및 부작용은 두 번째 식과 관련된 모든 값 계산 및 부작용 전에 시퀀싱됩니다.

참조 URL : https://stackoverflow.com/questions/2456086/order-of-execution-for-an-if-with-multiple-conditionals

반응형