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이기 때문입니다). 때문에, 「 」는,TRUE
1로 1면 .
★★★의 FALSE
추론입니다.'-'-'-'
'-' - '-'
ASCII 에서 「-」의 ASCII 「-」), 「-」의 ASCII 값), 「-」의 ASCII 값, 「-」의 ASCII 값, 「-」의 ASCII 값, 「0」의 ASCII 값). 때문에, 「 」는,FALSE
0이 .
이것은 당연한 것을 말하는 불쾌한 방법이다.
언급URL : https://stackoverflow.com/questions/34062595/strange-definitions-of-true-and-false-macros
'source' 카테고리의 다른 글
Vue .splice()가 항상 마지막 항목을 제거하는 이유 (0) | 2022.08.30 |
---|---|
코드 분할 원인에 대한 동적 가져오기: ESLint 구문 분석 오류 'import' (0) | 2022.08.30 |
Vue.js에서 "async/ait"을 사용할 수 있습니까? (0) | 2022.08.30 |
C 함수 구문, 파라미터 목록 뒤에 선언된 파라미터 유형 (0) | 2022.08.30 |
Nuxt.js nuxtServerInit 및 Vuex를 사용하여 데이터 서버를 로드하는 중 (0) | 2022.08.30 |