여러 조건의 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)
한다면x
이4
,그리고나서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
- & & 연산자는 왼쪽에서 오른쪽으로 그룹화됩니다.오퍼랜드 모두 컨텍스트에서 bool로 변환됩니다(Clause 4).결과는 두 오퍼랜드가 모두 true이면 true이고 그렇지 않으면 false입니다.&과 달리 &는 왼쪽에서 오른쪽으로의 평가를 보증합니다.첫 번째 피연산자가 false일 경우 두 번째 피연산자는 평가되지 않습니다.
- 결과는 bool입니다.두 번째 식을 평가할 경우 첫 번째 식과 관련된 모든 값 계산 및 부작용이 두 번째 식과 관련된 모든 값 계산 및 부작용보다 먼저 시퀀싱된다.
언급URL : https://stackoverflow.com/questions/2456086/order-of-execution-for-an-if-with-multiple-conditionals
'programing' 카테고리의 다른 글
Vue.JS 및 Rails-UJS/Jquery-UJS 경합 - Vuex 돌연변이가 작동하지 않음 (0) | 2022.08.11 |
---|---|
포인터가 NULL 포인터인지 확인하려면 어떻게 해야 하나요? (0) | 2022.08.11 |
VueJS/VueX : 상태 속성이 어레이일 때 워치가 호출되지 않음 (0) | 2022.08.11 |
마운트된 후크에서 VueTable 2 $refs 개체가 비어 있습니다. (0) | 2022.08.11 |
Vue.js는 여러 클릭 이벤트를 처리합니다. (0) | 2022.08.11 |