これは、1994年のC標準の改訂版であり、したがってC99標準の一部であったC digraphsを使用しています。彼らの実際の文字と二重字をスワップアウト、あなたが得る:
#include <stdio.h>
#define M(a,b) a##b
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf("%d", M(a,b)[a]);
printf("%d", M(a,b)[a]?a:b);
printf("%d", c=M(a,b)[a]?a:b);
}
ので、a##b
は、単一の識別子への入力を一緒にマージされることに注意してください。マクロはちょうどa
とb
を渡されているので、あなたが効果的に持っているので、結果は、ちょうどab
です:
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf("%d", ab[a]);
printf("%d", ab[a]?a:b);
printf("%d", c=ab[a]?a:b);
}
c
への割り当ては、実際には関係ありませんので、我々はそれを取り除くことができます。
main()
{
int a=1, b=2, ab[]={10,20};
printf("%d", ab[a]);
printf("%d", ab[a]?a:b);
printf("%d", ab[a]?a:b);
}
は今、私たちは静的にそれをうまくすることができますので、のは、三項演算子(?:
)を取り除くみましょう(a
は1とab[1]
が20であるため、ab[a]
は常に真である、すなわち、非ゼロ):
今
main()
{
int a=1, b=2, ab[]={10,20};
printf("%d", ab[a]);
printf("%d", a);
printf("%d", a);
}
、1
main()
{
int a=1, b=2, ab[]={10,20};
printf("%d", 20);
printf("%d", 1);
printf("%d", 1);
}
の可能性のある重複して
20
とa
で、彼らの実際の値で、すなわちab[a]
を変数に置き換える[Cを何??!??!演算子は?](http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) – GSergこれは難読化されたCコンテストからですか? –
は説明できません、また前に見たことがありません。これはosx/darwin/unixでコンパイルされます。 FYI、第1行は「20」、第2行「1」、第3行「1」を評価して印刷する。 – user3078414