Ik heb de volgende macrodefinities in een codeerboek gezien.
#define TRUE '/'/'/'
#define FALSE '-'-'-'
Er was daar geen uitleg.
Leg me uit hoe deze werken als TRUE
en FALSE
.
Antwoord 1, autoriteit 100%
Eens kijken: '/' / '/'
betekent de char
letterlijke /
, gedeeld door de char
letterlijke '/'
zelf. Het resultaat is er één, die redelijk klinkt voor TRUE
.
En '-' - '-'
betekent de char
letterlijke '-'
, afgetrokken van zichzelf. Dit is nul (FALSE
).
Hier zijn twee problemen mee: ten eerste is het niet leesbaar. Het gebruik van 1
en 0
is absoluut beter. Zoals TartanLlama en KerrekSB hebben opgemerkt, moet je, als je die definitie ooit gaat gebruiken, haakjes eromheen toevoegen, zodat je niet voor verrassingen komt te staan:
#include <stdio.h>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
printf ("%d\n", 2 * FALSE);
return 0;
}
Hiermee wordt de waarde van de char
letterlijke '-'
(45 op mijn systeem) afgedrukt.
Met haakjes:
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
het programma drukt de nul correct af, ook al heeft het niet veel zin om een waarheidswaarde te vermenigvuldigen met een geheel getal, maar het is slechts een voorbeeld van het soort onverwachte bugs dat u zou kunnen bijten als u uw macro’s niet tussen haakjes plaatst .
Antwoord 2, autoriteit 23%
Het is gewoon een andere manier van schrijven
#define TRUE 1
#define FALSE 0
De uitdrukking '/'/'/'
deelt de char-waarde van '/'
door zichzelf, wat 1 als resultaat geeft.
De uitdrukking '-'-'-'
zal de char-waarde van '-'
van zichzelf aftrekken, wat 0 als resultaat oplevert.
haakjes rond de hele define
-expressies ontbreken echter, wat kan leiden tot fouten in de code met behulp van deze macro’s. Jay’s antwoordbeantwoordt dat redelijk goed.
Een voorbeeld van een “real-life” scenario waarbij het vergeten van de haakjes schadelijk kan zijn, is het gecombineerde gebruik van deze macro’s met een cast-operator in C-stijl. Als iemand besluit om deze uitdrukkingen naar bool
in C++ te casten, bijvoorbeeld:
#include <iostream>
#define TRUE '/'/'/'
#define FALSE '-'-'-'
int main() {
std::cout << "True: " << (bool) TRUE << std::endl;
std::cout << "False: " << (bool) FALSE << std::endl;
return 0;
}
Dit is wat we krijgen:
True: 0
False: -44
Dus (bool) TRUE
zou eigenlijk evalueren tot FALSE
, en (bool) FALSE
zou evalueren tot TRUE
.
Antwoord 3, autoriteit 12%
Het staat gelijk aan schrijven
#define TRUE 1
#define FALSE 0
Wat de uitdrukking '/'/'/'
eigenlijk doet, is het teken /
(wat de numerieke waarde ook is) door zichzelf delen, zodat het 1
.
Op dezelfde manier trekt de uitdrukking '-'-'-'
het teken -
van zichzelf af en evalueert het tot 0
.
Het zou beter zijn om te schrijven
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
om onbedoelde wijziging van waarden te voorkomen bij gebruik met andere operators met een hogere prioriteit.
Antwoord 4, autoriteit 9%
Jayheeft al geantwoord waarom de waarden van deze expressies 0
en 1
.
Voor de geschiedenis: deze uitdrukkingen '/'/'/'
en '-'-'-'
komen uit een van de items van 1e internationale verduisterde C-codewedstrijd in 1984:
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);}
(Link naar het programma hier, er is een hint van wat dit programma doet op de IOCCC-pagina hierboven.)
Als ik me goed herinner, werden deze uitdrukkingen als versluierde macro’s voor TRUE
en FALSE
ook behandeld in “Obfuscated C and Other Mysteries”boek van Don Libes (1993).
Antwoord 5, autoriteit 2%
Het is een hilarische manier om macro’s te schrijven voor TRUE
en FALSE
.
Omdat er veel uitleg is gegeven, betekent /
een getal van 1 byte (volgens ASCII) wanneer het door zichzelf wordt gedeeld, het u 1
geeft dat wordt behandeld als TRUE
en eveneens -
is opnieuw een bytegetal wanneer dezelfde waarde wordt afgetrokken, het geeft u 0
die zal worden geïnterpreteerd als FALSE
#define TRUE '/'/'/'
#define FALSE '-'-'-'
daarom kunnen we /
of -
vervangen door elk willekeurig teken dat we leuk vinden, bijvoorbeeld:
#define TRUE '!'/'!'
#define FALSE 'o'-'o'
Behoudt dezelfde betekenis als de oorspronkelijke uitdrukking.
Antwoord 6, autoriteit 2%
Laten we beginnen met waar. Je kunt het lezen als '/' / '/'
, wat “teken ‘/’ gedeeld door teken ‘/'” betekent. Aangezien elk teken in C een numerieke waarde is (op één byte), kan het worden gelezen als “de ASCII-waarde van teken ‘/’ gedeeld door de ASCII-waarde van datzelfde teken”, wat 1 betekent (omdat, uiteraard, x/x is 1). Daarom is TRUE
1.
Voor FALSE
geldt dezelfde redenering: '-'-'-'
luidt '-' - '-'
, dwz ” de ASCII-waarde van ‘-‘ minus de ASCII-waarde van ‘-‘”, die 0 is. Daarom is FALSE
0.
Dit is een nare manier om het voor de hand liggende te zeggen.