코딩 북에서 다음과 같은 매크로 정의를 보았습니다.
#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 스타일 캐스트 연산자와 함께 사용하는 것입니다. 예를 들어 누군가가 boolC ++에서 이러한 표현식을 캐스트하기로 결정한 경우 :
#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)입니다. 따라서 TRUE1입니다.
에 대한 FALSE동일한 추론 : '-'-'-'reads '-' - '-', 즉 " '-'의 ASCII 값에서 '-'의 ASCII 값을 뺀 값 FALSE-0 "-따라서 0입니다.
이것은 명백한 것을 언급하는 불쾌한 방법입니다.
'/'/'/'1 인 모든 유효 자 세트의 여부 '/' == 47(이는 ASCII에서와 같이), 또는 '/' == 97(이 EBCDIC에서와 같이), 또는 임의의 다른 값.
'/'에 0. 이 값은 널 문자 용으로 예약되어 있습니다.