コーディングの本で次のマクロ定義を見ました。
#define TRUE '/'/'/'
#define FALSE '-'-'-'
そこには説明がありませんでした。
TRUE
これらがおよびとしてどのように機能するかを説明してくださいFALSE
。
ベストアンサー1
見てみましょう: は、リテラルをリテラル自体で割ったものを'/' / '/'
意味します。結果は 1 で、 としては妥当なようです。char
/
char
'/'
TRUE
そして、リテラルをそれ自体から減算した'-' - '-'
値を意味します。これはゼロ ( ) です。char
'-'
FALSE
これには 2 つの問題があります。まず、読みにくいことです。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 ('-'-'-')
真理値に整数を掛けるのはあまり意味がないにもかかわらず、プログラムは正しくゼロを出力しますが、これはマクロを括弧で囲まなかった場合に発生する可能性のある予期しないバグの一例にすぎません。