197
#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

を使用してコンパイルされた上記のプログラムの出力は次のとおりgccです。

0
1
1

-Wallor-Waddressオプションを使用するとgcc、警告が発行されます。

warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]

c上記のプログラムでどのように評価されていますか?

4

2 に答える 2

275

に評価されることはないc = i && (&i);ので、2番目の部分は冗長です。&ifalse

実際に単項をオーバーロードできるユーザー定義型の場合operator &、それは異なる可能性がありますが、それでも非常に悪い考えです。

警告をオンにすると、次のようなメッセージが表示されます。

警告:「i」のアドレスは常に「true」と評価されます</ p>

于 2012-12-19T06:51:26.037 に答える
119

&&&Cには演算子またはトークンはありません。ただし、 &&(論理 "and")および&(単項アドレス-ofまたはビット単位の "and")演算子は存在します。

最大のムンクルールにより、これは:

c = i &&& i;

これと同等です:

c = i && & i;

とがc両方ともtrueの場合は1に設定され、どちらかがfalseの場合は0に設定されます。i&i

intの場合、ゼロ以外の値はすべてtrueです。ポインタの場合、null以外の値はすべてtrueです(オブジェクトのアドレスは常にnullではありません)。それで:

がゼロ以外のc場合は1に設定され、がゼロに等しい場合はに設定されます。i0i

これは、&&&が意図的な難読化のためだけにここで使用されていることを意味します。割り当ては、次のいずれかになります。

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
于 2012-12-19T06:52:56.810 に答える