0으로 나눗셈을 하지 않은 것은 정의되지 않은 동작입니까?
다음 코드에 대해 일부 동료와 의견이 일치하지 않습니다.
int foo ( int a, int b )
{
return b > 0 ? a / b : a;
}
이 코드는 정의되지 않은 동작을 나타냅니까?
EDIT: 이 불일치는 컴파일러의 버그로 인해 시작되었습니다.이러한 오류는 컴파일러를 최적화하기 위한 것입니다.b > 0
체크가 최적화되었습니다.
아니요.
N4140에서 인용:
5 5.16 [ expr . cond ]/1
조건식은 오른쪽에서 왼쪽으로 그룹화됩니다.첫 번째 표현은 문맥적으로 bool로 변환됩니다.평가되며, 그것이 참일 경우 조건식의 결과는 두 번째 식의 값이 되고 그렇지 않을 경우 세 번째 식의 값이 됩니다.두 번째 식과 세 번째 식 중 하나만 평가됩니다.
상세:
5 5 [ expr ]/4
식을 평가하는 동안 결과가 수학적으로 정의되지 않았거나 해당 유형의 대표 가능한 값 범위에 포함되지 않은 경우 동작은 정의되지 않습니다.
이건 분명히 여기서 일어나지 않는다.같은 단락은 주석에서 0으로 나눗셈을 명시적으로 언급하고 있으며, 이는 비규범적이지만 이 상황과 관련이 있음을 더욱 명확히 하고 있다.
[주의: 기존 C++ 구현의 대부분은 정수 오버플로우를 무시합니다.제로 나눗셈 처리, 제로 제수를 사용하여 나머지를 형성하는 방법 및 모든 부동 소수점 예외는 기계마다 다르며, 일반적으로 라이브러리 함수에 의해 조정 가능합니다.: end note ]
또한 위의 요점을 보강하는 정황 증거도 있다: 조건부 연산자는 행동을 정의하지 않도록 하기 위해 사용된다.
8 8 . 5 [ dcl . init ] / 12 . 3
int f(bool b) { unsigned char c; unsigned char d = c; // OK, d has an indeterminate value int e = d; // undefined behavior return b ? d : 0; // undefined behavior if b is true }
위의 예에서는,d
초기화하다int
(또는 다른 것)unsigned char
)는 정의되어 있지 않습니다.그러나 UB 브랜치를 평가할 경우에만 UB가 발생한다고 명시되어 있습니다.
언어변호사의 관점에서 보자면, 이것이 UB일 수 있다면, 어떤 분할도 UB로 취급될 수 있습니다. 왜냐하면 제수가 0일 가능성이 있기 때문입니다.이것은 규칙의 정신이 아니다.
예제 코드에서는 0으로 분할할 수 없습니다.프로세서가 실행될 때a / b
는 이미 확인되었습니다.b > 0
,그러므로b
0이 아닙니다.
주의할 점은a == INT_MIN
그리고.b == -1
,그리고나서a/b
정의되지 않은 동작이기도 합니다.단, 이 상태는 다음과 같이 평가되기 때문에 이 문제는 방지됩니다.false
런런경경경경경경
당신이 말한게 정확히는 모르겠지만return b != 0 ? a / b : a;
andreturn b > 0 ? a / b : a;
b가 0보다 작을 경우 위의 조건이 아닌 한 나눗셈은 여전히 유효합니다.
이 코드는 정의되지 않은 동작을 나타냅니까?
아니, 그렇지 않아표현
return b > 0 ? a / b : a;
와 동등하다
if(b > 0)
return a/b; // this will be executed only when b is greater than 0
else
return a;
, 하다, 하다, 하다, 할 때만 .b
0
만약 이것이 UB라면, 그것도 마찬가지입니다.
if(a != null && *a == 42)
{
.....
}
또한 ifs, and and ors의 시퀀스는 이러한 유형의 구성을 구체적으로 허용하도록 명확하게 설계되어 있습니다.당신 동료들이 그것에 대해 이의를 제기할 거라고는 생각되지 않는다.
언급URL : https://stackoverflow.com/questions/40172606/is-unevaluated-division-by-0-undefined-behavior
'programing' 카테고리의 다른 글
Vuex mapGetters 사용 시 TypeScript 오류를 수정하는 방법 (0) | 2022.07.16 |
---|---|
Nuxt.js를 사용하여 Vuex 변수를 Axios로 전달하려면 어떻게 해야 합니까? (0) | 2022.07.16 |
vuex 상태에 액세스하는 데 어려움을 겪고 있습니다. (0) | 2022.07.16 |
어떻게 하면 C에 예외를 둘 수 있나요? (0) | 2022.07.16 |
세트에서 랜덤 요소 선택 (0) | 2022.07.16 |