TRUE および FALSE マクロの奇妙な定義 質問する

TRUE および FALSE マクロの奇妙な定義 質問する

コーディングの本で次のマクロ定義を見ました。

#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 ('-'-'-')

真理値に整数を掛けるのはあまり意味がないにもかかわらず、プログラムは正しくゼロを出力しますが、これはマクロを括弧で囲まなかった場合に発生する可能性のある予期しないバグの一例にすぎません。

おすすめ記事