source

TRUE 매크로와 FALSE 매크로의 이상한 정의

gigabyte 2022. 8. 30. 22:22
반응형

TRUE 매크로와 FALSE 매크로의 이상한 정의

나는 코딩 책에서 다음과 같은 매크로 정의를 보았다.

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

거기에는 아무런 설명이 없었다.

이것들이 어떻게 기능하는지 설명해 주세요.TRUE그리고.FALSE.

어디 보자:'/' / '/'를 의미합니다.char문자 그대로의/, 로 나눕니다char문자 그대로의'/'그 자체입니다.그 결과는 1로, 이것은 에 있어서 타당하게 들린다.TRUE.

그리고.'-' - '-'를 의미합니다.char문자 그대로의'-', 그 자체에서 뺍니다.이것은 제로입니다(FALSE).

여기에는 두 가지 문제가 있습니다. 첫째, 읽을 수 없습니다.사용.1그리고.0훨씬 낫습니다.그리고 타탄라마와 케렉으로SB는 이 정의를 사용하려면 괄호를 둘러서 괄호를 표시해야 한다고 지적했습니다. 그래야 놀라지 않습니다.

#include <stdio.h>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
        printf ("%d\n", 2 * FALSE);
        return 0;
}

그러면 다음 값이 출력됩니다.char문자 그대로의'-'(내 시스템에서는 45).

괄호 포함:

#define TRUE  ('/'/'/')
#define FALSE ('-'-'-')

이 프로그램은 진실 값에 정수를 곱하는 것은 별로 의미가 없지만 매크로를 괄호 안에 넣지 않으면 당신을 물릴 수 있는 예기치 않은 버그의 일례에 불과합니다.

Jay는 이미 왜 이 표현들의 값들이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);}

(여기에 있는 프로그램에 대한 링크는 위의 IOCC 페이지에 이 프로그램이 수행하는 작업에 대한 힌트가 있습니다.)

또, 이 표현들이, 다음의 매크로로서 올바르게 기억되고 있는 경우는,TRUE그리고.FALSE돈 리브스(1993)의 '암독 C와 기타 미스터리' 책에서도 다뤄졌다.

그냥 또 다른 글쓰기 방법일 뿐이야

#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.

이것은 매크로를 작성하는 재미있는 방법입니다.True그리고.False.

많은 설명이 제공되었으므로/1바이트의 숫자(ASCII에 준거)를 의미합니다.1로서 취급될 것이다.True마찬가지로-이 값을 빼면 다시 바이트 번호가 됩니다.0그것은 로 해석될 것이다.false

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

그래서 우리는 교환할 수 있다./또는-예를 들어 다음과 같이 원하는 문자를 사용합니다.

#define TRUE  '!'/'!'
#define FALSE 'o'-'o'

원래 표현과 같은 의미를 유지합니다.

그것은 글쓰기와 같다.

#define TRUE 1
#define FALSE 0

무슨 표정이야?'/'/'/'실제로 하는 것은 캐릭터를 나누는 것이다./(숫자값이 무엇이든) 그 자체이기 때문에1.

마찬가지로 표현은'-'-'-'를 빼다- 합니다.0.

쓰는 것이 좋을 것이다.

#define TRUE ('/'/'/')
#define FALSE ('-'-'-')

다른 고농도 연산자와 함께 사용할 때 우발적인 값 변경을 방지하기 위해 사용합니다.

사실로 시작합시다..'/' / '/'의 '/'는 '/'을 '/'로 나눈다는 뜻이죠.C의 각 문자는 숫자 값(1바이트)이므로 "/ 문자의 ASCII 값을 같은 문자의 ASCII 값으로 나눈 값"으로 읽을 수 있습니다. 즉, 1을 의미합니다(분명히 x/x는 1이기 때문입니다). 때문에, 「 」는,TRUE1로 1면 .

★★★의 FALSE추론입니다.'-'-'-''-' - '-'ASCII 에서 「-」의 ASCII 「-」), 「-」의 ASCII 값), 「-」의 ASCII 값, 「-」의 ASCII 값, 「-」의 ASCII 값, 「0」의 ASCII 값). 때문에, 「 」는,FALSE0이 .

이것은 당연한 것을 말하는 불쾌한 방법이다.

언급URL : https://stackoverflow.com/questions/34062595/strange-definitions-of-true-and-false-macros

반응형