programing

여러 조건의 if 실행 순서

kingscode 2022. 8. 11. 18:41
반응형

여러 조건의 if 실행 순서

여러 조건의 if 스테이트먼트에서 첫 번째 조건의 결과가 명확할 경우 두 번째 조건이 실행됩니까?

예:

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

조건을 스왑하면 i의 음수에 대해 segfault가 발생할 수 있지만 이렇게 하면 segfault가 발생하지 않습니다.이것이 항상 기능하는지, 아니면 nested if 문을 사용해야 하는지 확인할 수 있습니까?

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

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

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

조건의 순서를 변경하면 늘 포인터로 메서드를 호출하여 크래시가 발생할 수 있습니다.C의 유사한 예에서는 구조물에 대한 포인터가 있을 때 해당 구조체의 필드를 사용합니다.

또는 다음과 같은 방법으로 작업을 수행할 수 있습니다.

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

이것은 또한 만약의 경우 부작용을 피하는 것이 일반적으로 좋은 생각이라는 이유 중 하나이다.

예를 들어 다음과 같습니다.

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

한다면x4,그리고나서y가치에 관계없이 증가하다z또는y단,x아니다4는 전혀 증가하지 않습니다.

연산자&&그리고.||좌측 표현이 우측을 평가하기 전에 완전히 평가(및 모든 부작용이 적용됨)되도록 보장합니다.즉, 연산자는 시퀀스 포인트를 도입합니다.

또한 식 값이 lhs에서 결정될 수 있는 경우 rhs는 평가되지 않습니다.즉, 이런 표현이 있으면x && y및 x는 0(false)으로 평가되며 식 값은 y에 관계없이 false이므로 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).결과는 두 오퍼랜드가 모두 true이면 true이고 그렇지 않으면 false입니다.&과 달리 &는 왼쪽에서 오른쪽으로의 평가를 보증합니다.첫 번째 피연산자가 false일 경우 두 번째 피연산자는 평가되지 않습니다.
  2. 결과는 bool입니다.두 번째 식을 평가할 경우 첫 번째 식과 관련된 모든 값 계산 및 부작용이 두 번째 식과 관련된 모든 값 계산 및 부작용보다 먼저 시퀀싱된다.

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

반응형