코딩 북에서 다음과 같은 매크로 정의를 보았습니다.
#define TRUE '/'/'/'
#define FALSE '-'-'-'
거기에 대한 설명이 없었습니다.
다음과 같이 작동하는 방법을 나에게 설명해주십시오 TRUE
과 FALSE
.
코딩 북에서 다음과 같은 매크로 정의를 보았습니다.
#define TRUE '/'/'/'
#define FALSE '-'-'-'
거기에 대한 설명이 없었습니다.
다음과 같이 작동하는 방법을 나에게 설명해주십시오 TRUE
과 FALSE
.
답변:
보자 : '/' / '/'
수단 char
문자 /
에 의해 구분, char
문자 그대로의 '/'
자신을. 그 결과는 합리적으로 들리는 것입니다 TRUE
.
그리고 문자 자체를 빼는 '-' - '-'
것을 의미합니다 . 이것은 0 입니다.char
'-'
FALSE
이것에는 두 가지 문제가 있습니다 : 첫째, 읽을 수 없습니다. 사용 1
하고 0
절대적으로 좋습니다. 또한 TartanLlama와 KerrekSB가 지적했듯이 그 정의를 사용하려는 경우 괄호를 추가하여 놀라지 않도록하십시오.
#include <stdio.h>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
printf ("%d\n", 2 * FALSE);
return 0;
}
이것은 char
리터럴 의 값을 인쇄합니다 '-'
(시스템의 45).
괄호로 :
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
진리 값에 정수를 곱하는 것이별로 의미가 없지만 프로그램은 0을 올바르게 인쇄하지만 매크로를 괄호로 묶지 않으면 예상치 못한 버그의 예일뿐입니다.
if
대신 곱의 TRUE
정수로.
notx = TRUE- x;
작동 할 수 있습니다 . 이 제외 TRUE-FALSE
-44이다 (가정 ASCII)
그것은 또 다른 쓰기 방법입니다
#define TRUE 1
#define FALSE 0
이 표현식 '/'/'/'
은 char 값을 '/'
자체적으로 나누므로 결과적으로 1이됩니다.
이 표현식 '-'-'-'
은의 char 값을 뺍니다.'-'
자체에서 결과적으로 0을 제공합니다.
define
그러나 전체 표현식 주위에 대괄호 가 누락되어 이러한 매크로를 사용하는 코드에서 오류가 발생할 수 있습니다. 제이의 대답 그 점을 잘 보여줍니다.
대괄호를 잊어 버릴 수있는 "실제"시나리오의 예는 이러한 매크로를 C 스타일 캐스트 연산자와 함께 사용하는 것입니다. 예를 들어 누군가가 bool
C ++에서 이러한 표현식을 캐스트하기로 결정한 경우 :
#include <iostream>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
std::cout << "True: " << (bool) TRUE << std::endl;
std::cout << "False: " << (bool) FALSE << std::endl;
return 0;
}
우리가 얻는 것은 다음과 같습니다.
True: 0
False: -44
그래서 (bool) TRUE
사실에 평가하는 것 false
, 그리고 (bool) FALSE
로 평가 것입니다 true
.
쓰기에 해당합니다
#define TRUE 1
#define FALSE 0
표현식이 '/'/'/'
실제로하는 일은 문자 /
(숫자 값이 무엇이든)를 자체적으로 나누는 것 1
입니다.
마찬가지로 표현식 '-'-'-'
은 문자 -
자체를 빼고로 평가합니다 0
.
쓰는 것이 좋습니다
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
우선 순위가 높은 다른 연산자와 함께 사용할 때 실수로 값이 변경되는 것을 방지합니다.
제이는 이미 이러한 식의 값이 왜 대답 0
하고 1
.
역사를 위해,이 표현 '/'/'/'
과 '-'-'-'
의 항목 중 하나에서 오는 1984 년 제 1 회 국제 난독 C 코드 대회 :
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
( 여기 의 프로그램 링크 는 위의 IOCCC 페이지에이 프로그램의 기능에 대한 힌트가 있습니다.)
나는에 대한 난독 매크로로 제대로 이러한 식을 기억 또한 경우 TRUE
와 FALSE
도 덮여 있었다 "난독 C 및 다른 신비" 돈 리브 (Don Libe) (1993)에 의해 책.
true로 시작합시다. 로 읽을 수 있습니다. '/' / '/'
"문자 '/'를 문자 '/'로 나눈"을 의미합니다. C의 각 문자는 1 바이트 단위의 숫자 값이므로 "문자 '/'의 ASCII 값을 동일한 문자의 ASCII 값으로 나눈 ASCII 값"으로 읽을 수 있습니다. 이는 1을 의미합니다. x / x는 1)입니다. 따라서 TRUE
1입니다.
에 대한 FALSE
동일한 추론 : '-'-'-'
reads '-' - '-'
, 즉 " '-'의 ASCII 값에서 '-'의 ASCII 값을 뺀 값 FALSE
-0 "-따라서 0입니다.
이것은 명백한 것을 언급하는 불쾌한 방법입니다.
'/'/'/'
1 인 모든 유효 자 세트의 여부 '/' == 47
(이는 ASCII에서와 같이), 또는 '/' == 97
(이 EBCDIC에서와 같이), 또는 임의의 다른 값.
'/'
에 0
. 이 값은 널 문자 용으로 예약되어 있습니다.