stdbool.h는 일반적으로 다음과 같이 정의됩니다.
#define false 0
#define true 1
그리고 유닉스 프로그램에는 false
다음과 같이 정의된 실패 상태 코드가 하나만 있습니다.
int
main(int argc, char *argv[])
{
return (1);
}
완전성을 위해 유닉스 프로그램의 정의는 다음 true
과 같습니다.
int
main(int argc, char *argv[])
{
return (0);
}
분명히 이것은 value 의 정반대입니다 false
. 분명히 stdbool.h에 있습니다. 내가 사용한 버전은오픈BSDcoreutils에는 더 많은 버전이 있기 때문에말 수가 많은
이러한 차이가 발생하는 역사적 이유는 무엇입니까?
답변1
프로그램은 다양한 이유로 실패할 수 있습니다. 예를 들어, grep
필요한 패턴을 찾을 수 없거나 지정된 파일 중 하나를 열 수 없으면 실패합니다.
현재 Unix에서는 하위 프로세스에서 상위 프로세스로 1(부호 없는) 바이트 값(반환 코드)을 전달할 수 있습니다(어떤 신호가 하위 프로세스를 죽였는지, 코어가 생성되었는지 등에 대한 정보는 무시하고 있습니다. more 자세한 정보) 조금 뒤로).
실패하는 방법은 다양하므로 이러한 다양한 실패를 인코딩하는 여러 개의 반환 코드와 성공을 나타내는 하나의 반환 코드를 갖는 것이 합리적입니다.
( 0
)는 성공을 나타내는 합리적인 선택이고 나머지 (1-255)는 실패(및 실패 유형)를 나타냅니다.
성공에는 17, 실패에는 0~16, 18~255를 사용하는 것이 전적으로 가능합니다. 하지만 단순화를 위해 성공에는 0, 실패에는 1~255를 선택하겠습니다. 따라서 범위가 있습니다. 성공의 경우 255를 사용하고 실패의 경우 0~254를 사용하는 것도 똑같이 간단합니다. 그러나 이는 향후 변경 사항을 8비트 이상 반환으로 제한하고 단일 오류 코드의 범위를 단순하게 유지합니다.
답변2
당신은 사과를 배와 비교하고 있습니다. 맛이 다릅니다. :-)
산수
하나산수 0
이는 c와 shell 모두에서 false [a]를 의미합니다.
$ if ((0)); then echo true; else echo false; fi
false
또는 더 이식성 있지만 더 복잡한 테스트에서는 다음과 같습니다.
$ echo $(( 22 == 23 ))
0
[a] 실제로 작성되는 내용은 0
십진수 바이트 값이 (A 값 ) 축제 값 의 단어 48
로 투명하게 변환되는 ASCII 문자( )(대부분의 시스템에서는 ASCII이지만 다른 시스템에서는 아마도 다른 것일 수도 있음)입니다. 이 바이트 값은 false를 의미 합니까?0
c char
0
0
c에서
산술 확장은 사실상 C 산술의 직접적인 복사본이기 때문에 이는 대부분의 쉘에 해당됩니다. 거기에는 어떤 차이도 있어서는 안 됩니다.
종료 상태
그러나 유틸리티의 종료 상태( $?
)는 다릅니다.
$ echo "$(( 22 == 23 )) $? -- $((22 == 22 )) $?"
0 0 -- 1 0
이론
나는 이것이 왜 그런지에 대해서만 내 자신의 의견을 제시할 수 있습니다.
존재하다고전 논리, 의도된 의미론으로,진리값은 참입니다(1 또는베룸 ⊤), 거짓 또는 거짓(0 또는풀섬 ⊥)
명제논리 진리표: 참값을 1로, 거짓값을 0으로 표현합니다.
nothing/empty
그것은 인간의 사고방식을 보다 가까운 방식으로 코드화한 것일 뿐입니다 false
.
이 설명은C언어로 코딩하기
그러나 오류 종료 상태에 대해 하나의 값만 갖는 경우( 0
)가 너무 좁아서 논리가 반전되어 ( 0
)가 다음으로 변경됩니다.성공, 오류에 대한 여러 가지 가능한 이유로 더 많은 코드를 남깁니다. 이것이 쉘에서 사용되는 방법입니다.
답변3
참=1, 거짓=0의 기원
참이 1이고 거짓이 0인 이유에 대한 역사적 배경이 궁금하다면 부울 대수학은 1847년 조지 불(George Bool)이 "발명"했다는 점을 지적하고 싶습니다. 이것은 최초의 전자 컴퓨터가 등장하기 훨씬 이전의 일이었습니다. 부울 대수학은 Mathematical Analysis of Logic에 게재되었습니다. 프로젝트 구텐베르그(Project Gutenberg)의 사본을 읽을 수 있습니다:http://www.gutenberg.org/files/36884/36884-pdf.pdf
나는 그것을 자세히 읽었다고 주장하지는 않지만 George Boole 자신이 참에 1을 사용하고 거짓에 0을 사용했다는 것을 충분히 훑어봤습니다.
계산에 대한 부울 영향
부울의 대수학("부울 대수학")은 그의 죽음 이후 오랫동안 선택되어 계산에 사용될 때까지 거의 무시되었습니다. 실리콘 기반 컴퓨터 이전에도 부울 대수학은 이진 전자 장치(아날로그와 반대)에서 유용하게 사용되었습니다. 수학 논리 연산자를 트랜지스터 배선으로 바꾸는 것은 쉽습니다(참조여기). 거기에서 여러 개의 논리 게이트가 함께 연결되어 이진수를 나타내고간단한 산술 연산 수행.
"if" 문과 관련하여 이러한 문은 CPU의 "조건부 점프" 작업에서 발생합니다. 여기서 점프는 goto
고급 언어에서 점프라고 합니다.
조건부 점프의 경우 CPU는 점프할지 여부를 선택하는 유용한 방법을 정의해야 합니다. 가장 일반적인 두 가지 조건은 "0인 경우 점프"와 "음수인 경우 점프"입니다(밑줄 친 부분 참조).여기). 그러나 숫자를 양수 또는 음수로 해석하는 것은 동일한 CPU 작업이 사용되므로 주관적일 수 있습니다.두 분 모두 칭찬해부호 있는 정수는 "부호 없는" 정수처럼 작동합니다.
if
따라서 이는 다음과 같은 이유로 0을 거짓으로, 1을 참으로 표현하는 것이 일반적인 용어라는 것을 의미합니다 .
- 부호 없는 정수에는 음수/양수 정의가 작동하지 않습니다.
- 0은 참, 1은 거짓을 나타내며 이는 일반적으로 사용되는 부울 대수와는 반대입니다.
껍질은 왜 다른가요?
그 반대의 일을 하는 껍질의 유래는 찾기 어렵다. 0의 성공은 확실히 1970년대로 거슬러 올라갑니다.아마도 유닉스의 초기 버전일 것이다.(확실하지 않다).
내 생각에는 프로젝트가 한 가지 방법으로만 완전히 성공할 수 있고 여러 가지 방법으로 실패할 수 있다는 것입니다.
분명한 것은 true
and false
명령이 조건부 논리에 사용하기 위해 명령 종료 상태에 대한 쉘의 해석을 따르도록 설계되었다는 것입니다.
if first_command ; then
second_command
fi
위의 코드는 성공 second_command
하면 실행된다는 의미입니다 first_command
. 따라서 항상 성공하는 논리적 자리 표시자의 좋은 이름은 입니다 true
.
답변4
이것이 내가 생각할 수 있는 유일한 이유이고, 나에게는 꽤 강력해 보인다.
부울 연산을 컴퓨터 연산으로 변환하는 가장 쉬운 방법은 0
for FALSE
및 1
for 를 사용하는 것입니다 TRUE
. 그러면 이를 사용하는 모든 연산이 의미가 있습니다.
TRUE && TRUE = TRUE ( 1 * 1 = 1)
TRUE && FALSE = FALSE ( 1 * 0 = 0)
TRUE || FALSE = TRUE ( 1 + 0 = 1)
FALSE || FALSE = FALSE ( 0 + 0 = 0)
기타 등등
동시에 프로그램은 다양한 오류를 보고하기 위해 여러 종료 상태를 요구합니다. 올바른 종료 상태를 로 설정한 다음 나머지 255개(부호 없는 문자)를 오류 종료 상태로 사용하는 0
것이 논리적입니다 .
물론, 지금 좋은 출구를 갖는 것은 매우 비논리적이지만 1
, 나쁜 출구는 찢어진 배열로 변합니다 0
.2..555