「今まで出会った中で最もエレガントなアウトプットの方法」か何かというタイトルのSNSの写真アルバムで、この2つのステートメントに出くわしました。
以下に 2 つのステートメントを示します。
printf("%d%c", a, " \n"[i==n]);
puts("YES\0No"+condition * 4);
彼らが何をしているのか、どのように機能しているのか、私にはわかりません。誰か説明してくれませんか?ありがとうございました。
" \n"[i==n]
i==n
は、 0 または 1 に評価される式 を取り、それを配列 へのインデックスとして使用して、 または のいずれか" \n"
を取得します。' '
'\n'
"YES\0N0"+condition * 4
これは"YES\0N0"
、これを含むほとんどの式で使用されると、最初の要素へのポインターに「減衰」し、このポインターに追加condition * 4
されます。が 1 の場合、 の先頭condition
にある へのポインタが生成されます。'N'
"N0"
の場合i != n
は の後にスペースが出力され%d
、それ以外の場合は改行が出力されます。
// printf("%d%c", a, " \n"[i==n]);
// when i != n
printf("%d%c", a, " \n"[0]); // or
printf("%d%c", a, ' '); // or
printf("%d ", a); // or
// when i == n
printf("%d%c", a, " \n"[1]); // or
printf("%d%c", a, '\n'); // or
printf("%d\n", a); // or
数値セパレータを表示する興味深い方法で、for
ループで使用される可能性があります。
に類似puts("YES\0N0"+condition * 4);
条件が 0 の場合、出力します
puts("YES");`
条件が1の場合、印刷します
puts("N0");` // Thanks @ Jonathan Leffler