programing

0으로 나눗셈을 하지 않은 것은 정의되지 않은 동작입니까?

copysource 2022. 7. 16. 13:41
반응형

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,그러므로b0이 아닙니다.

주의할 점은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

반응형