3

「今まで出会った中で最もエレガントなアウトプットの方法」か何かというタイトルのSNSの写真アルバムで、この2つのステートメントに出くわしました。

以下に 2 つのステートメントを示します。

printf("%d%c", a, " \n"[i==n]);
puts("YES\0No"+condition * 4);

彼らが何をしているのか、どのように機能しているのか、私にはわかりません。誰か説明してくれませんか?ありがとうございました。

4

2 に答える 2

6

" \n"[i==n]i==nは、 0 または 1 に評価される式 を取り、それを配列 へのインデックスとして使用して、 または のいずれか" \n"を取得します。' ''\n'

"YES\0N0"+condition * 4これは"YES\0N0"、これを含むほとんどの式で使用されると、最初の要素へのポインターに「減衰」し、このポインターに追加condition * 4されます。が 1 の場合、 の先頭conditionにある へのポインタが生成されます。'N'"N0"

于 2014-02-12T04:47:47.723 に答える
1

の場合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 
于 2014-02-12T04:45:50.853 に答える