1. ホーム
  2. c++

マクロで1と0を定義するのに、なぜ三項演算子が使われるのですか?

2023-09-14 05:34:21

質問

私は組み込みプロジェクトのために SDK を使用しています。このソースコードの中に、少なくとも私は奇妙だと思うコードを見つけました。SDK の多くの場所で、この形式のソース コードがあります。

#define ATCI_IS_LOWER( alpha_char )  ( ( (alpha_char >= ATCI_char_a) && (alpha_char <= ATCI_char_z) ) ? 1 : 0 )

#define ATCI_IS_UPPER( alpha_char )  ( ( (alpha_char >= ATCI_CHAR_A) && (alpha_char <= ATCI_CHAR_Z) ) ? 1 : 0 )

ここで三項演算子を使うことで何か違いがあるのでしょうか?

ではありません。

#define FOO (1 > 0)

と同じ

#define BAR ( (1 > 0) ? 1 : 0)

?

で評価してみましたが

printf("%d", FOO == BAR);

を実行し、結果1を得たので、両者は等しいと思われます。このような書き方をする理由はあるのでしょうか?

どのように解決するのですか?

あなたの言うとおり、C言語では同語反復です。あなたの特定の三項条件 (1 > 0) は、タイプ int .

しかし、それは は C++ では問題ですが、いくつかの不思議なケース(例えばオーバーロードされた関数のパラメータとして)で、三項条件式が int であるのに対し (1 > 0)bool .

私の推測では、作者はC++の互換性を維持することを念頭に置いて、これにいくつかの考えを入れたのだと思います。