정의되지 않은 값

Undefined value

컴퓨팅(특히 프로그래밍에서)에서 정의되지 않은 구문론적으로 정확하지만 에 올바른 이 없는 조건이다.정의되지않은값은 빈 문자열, 부울"거짓"또는 기타"빈"값(그러나 정의됨)과 혼동해서는 안 된다.상황에 따라 정의되지 않은 값으로 평가하면 예외 또는 정의되지 않은 동작으로 이어질 수 있지만, 일부 프로그래밍 언어에서는 정의되지 않은 값이 정상적이고 예측 가능한 프로그램 실행 과정 중에 발생할 수 있다.

동적으로 입력된 언어는 일반적으로 가능하면 정의되지 않은 값을 명시적으로 취급한다.예를 들어 펄은undef이러한 값을 변수에 "조정"할 수 있는 연산자[1].다른 유형의 시스템에서 정의되지 않은 값은 알 수 없고 예측할 수 없는 값 또는 평가 시 프로그램 실패를 의미할 수 있다.무효화 유형은 중간 접근 방식을 제공한다. 아래를 참조하십시오.

처리

부분함수의 값이 그 인수가 그 정의 영역을 벗어나면 정의되지 않는다.여기에는 0으로 나누기, 제곱근 또는 음수로그 등 수많은 산술적 사례가 포함된다.또 다른 일반적인 예로는 범위를 벗어난 인덱스로 어레이에 액세스하는 것이 있으며, 여기에는 포함되지 않은 키에 대한 연관 배열의 값이 포함된다.이러한 상황을 실무에서 처리하는 방법은 다양하다.

유보값

정의되지 않은 값을 우아하게 처리해야 하는 애플리케이션에서는 보통 정상 값과 구별할 수 있는 특별한 null 값을 예약하는 것이 일반적이다.이것은 이전에 정의되지 않았던 경우를 나타내기 위해 정의된 값을 생성함으로써 어려움을 해결한다.이에 대한 예는 다음과 같다.

  • C 표준 I/O 라이브러리는 특별한 가치를 보유함EOF더 이상의 입력을 사용할 수 없음을 나타내기 위해.getchar()함수는 사용 가능한 다음 입력 문자를 반환한다.EOF만약 더 이상 이용할 수 없다면(ASCII 문자 코드는 이러한 목적을 위해 null 문자를 정의하지만, 표준 I/O 라이브러리는 null 문자를 주고 받을 수 있기를 원하므로 별도의 문자를 정의한다.EOF값.
  • IEEE 754 부동 소수점 산술 표준은 산술 연산에 정의된 값이 없을 때 반환되는 특별한 "숫자가 아닌" 값을 정의한다.를 들어 0으로 나누거나, 음수제곱근 또는 로그가 있다.
  • 구조화된 쿼리 언어에는 특별한 기능이 있음NULL누락된 데이터를 나타내는 값.
  • Perl 언어는 표현식의 정의 여부를 다음을 통해 확인할 수 있도록 한다.defined()술어를 [2]붙이다
  • 많은 프로그래밍 언어가 유효한 포인터와는 구별되는 null 포인터 개념을 지원하며, 종종 오류 반환으로 사용된다.
  • 일부 언어에서는 대부분의 유형을 무효로 할 수 있다(예: C#).[3]
  • 대부분의 유닉스 시스템 호출은 고장을 나타내기 위해 특수 값 -1을 반환한다.

동적으로 입력된 언어는 초기화되지 않은 변수가 null 값으로 기본 설정되도록 하는 경우가 많지만, 정적으로 입력된 값은 null 값(잘 정의된)과 null 값을 구분하지 않는 경우가 많다.[3]

예외처리

일부 프로그래밍 언어에는 값을 반환하지 못하는 경우를 처리하기 위한 예외 처리 개념이 있다.함수는 정해진 방법으로 반환되지만 값을 반환하지 않기 때문에 반환하기 위해 특별한 가치를 발명할 필요가 없다.

이것에 대한 변화는 신호 처리인데, 이것은 운영 체제 수준에서 이루어지며 프로그래밍 언어에 통합되지 않는다.신호 핸들러는 계산의 일부를 종료하는 것과 같은 일부 형태의 복구를 시도할 수 있지만 완전히 통합된 예외 처리만큼의 유연성 없이 시도할 수 있다.

되돌리지 않는 기능

결코 돌아오지 않는 함수는 그 값을 결코 관측할 수 없기 때문에 정의되지 않은 값을 갖는다.그러한 함수는 공식적으로 값이 없는 하단 타입으로 할당된다.예는 두 가지 범주로 나뉜다.

  • 영원히 반복되는 기능들.이것은 고의적으로 또는 결코 발견되지 않을 어떤 것에 대한 검색의 결과로서 발생할 수 있다. (예를 들어, 부분 재귀 함수μ 연산자 실패의 경우)
  • 시스템 호출과 같이 계산을 종료하는 함수.프로그램 내에서 이것은 앞의 경우와 구별할 수 없지만 프로그램의 호출자에게 차이를 만든다.

정의되지 않은 동작

앞에서 설명한 정의되지 않은 값을 처리하는 모든 방법은 정의되지 않은 값을 검출할 것을 요구한다.즉, 호출된 함수는 정상적인 결과를 반환할 수 없다고 판단하고 발신자에게 통지하는 어떤 조치를 취한다.스펙트럼의 다른 쪽 끝에서 정의되지 않은 동작은 호출자에게 해당 영역을 벗어난 인수가 있는 함수를 호출하지 않도록 하기 위해 책임을 부과한다.일어날 수 있는 일에는 제한이 없다.기껏해야 쉽게 감지할 수 있는 충돌, 최악의 경우 관련이 없어 보이는 계산상의 미묘한 오류.

("정의되지 않은 행동"의 공식적 정의는 "Halt and catch fire"와 "귀신을 코 밖으로 날게 한다"와 같은 것들을 포함하여 훨씬 더 극단적인 가능성을 포함한다.)[4]

대표적인 예가 매달린 포인터 참조다.유효한 포인터폐기하는 것은 매우 빠르지만 포인터가 유효한지 결정하는 것은 매우 복잡할 수 있다.따라서 컴퓨터 하드웨어와 C와 같은 저수준 언어는 포인터들을 폐기하기 전에 검증하려고 하지 않고 프로그래머에게 책임을 전가한다.이것은 안전을 희생하고 속도를 낸다.

정의되지 않은 값 센스 엄격

정의되지 않은 값의 엄격한 정의는 무의미하지만 정의되지 않은 행동을 유발하지 않는 피상적으로 유효한(null이 아닌) 출력이다.예를 들어, 음수를 빠른 역제곱근 함수에 전달하면 숫자가 생성된다.그리 유용한 숫자는 아니지만, 계산이 완료되어 무언가를 반환할 것이다.

정의되지 않은 값은 특히 하드웨어에서 자주 발생한다.와이어가 유용한 정보를 전달하지 않는 경우, 와이어는 여전히 존재하며 전압 레벨이 일정하다.전압은 비정상적이면 안 되지만(예: 손상되는 과전압은 안 됨), 특정 논리 수준은 중요하지 않다.

데이터 버퍼가 제공되지만 완전히 채워지지 않은 소프트웨어에서도 동일한 상황이 발생한다.예를 들어, C 라이브러리strftime함수는 제공된 출력 버퍼에서 타임스탬프를 사람이 읽을 수 있는 형태로 변환한다.출력 버퍼가 결과를 저장할 만큼 크지 않으면 오류가 반환되고 버퍼의 내용이 정의되지 않는다.

다른 방향에서 POSIX에서 시스템 호출은 파일 이름, 일부 플래그 및 파일 모드라는 세 가지 인수를 취한다.파일 모드는 플래그에 다음이 포함된 경우에만 사용됨O_CREAT. 의 두 가지 주장 형식을 사용하는 것이 일반적이다.open, 파일 모드에 대해 정의되지 않은 값을 제공하는 경우O_CREAT누락되다

때로는 한정된 방법으로 이렇게 정의되지 않은 가치관을 가지고 작업하는 것이 유용하다.나중에 정의되지 않은 값을 무시해도 전체 계산은 여전히 잘 정의될 수 있다.

이것의 예로서, C 언어는 포인터를 정수로 변환하는 것을 허용하지만, 그 정수의 숫자 값은 정의되지 않았다.디버깅, 동일성을 위한 두 개의 포인터를 비교하거나 XOR 연결 목록을 만드는 데 여전히 유용할 수 있다.

사실 이후 레이스 상태를 감지하는 낙관적 동시성 제어 시스템에서는 정의되지 않은 값을 안전하게 처리하는 것이 중요하다.예를 들어, Seqlock으로 보호되는 공유 변수를 읽으면 경주 조건이 발생했는지 결정하기 에 정의되지 않은 값이 생성된다.그런 다음 정의되지 않은 데이터를 삭제하고 작업을 다시 시도한다.이는 정의되지 않은 값에 대해 수행된 연산이 완전한 정의되지 않은 동작을 생성하지 않는 한 정의된 결과를 생성한다.

정의되지 않은 값이 유용한 다른 예로는 난수 생성기해시함수가 있다.반환되는 특정 값은 정의되지 않았지만, 특성이 잘 정의되어 있어 오류 없이 사용할 수 있다.

표기법

계산가능성 이론에서 표현식의 정의되지 않은 것은 exprent로, 정의는 expr로 나타낸다.

참고 항목

참조

  1. ^ "undef". Perl 5 documentation. 2009-09-25. Retrieved 2010-03-26.
  2. ^ "defined". Perl 5 documentation. 2009-09-25. Retrieved 2010-03-26.
  3. ^ a b Carr, Richard (2006-10-01). "C# Nullable Numeric Data Types". C# Fundamentals tutorial. Retrieved 2010-03-27.
  4. ^ "Nasal demons". Jargon File. Retrieved 2014-06-12.