私はCで有名な「fizzbuzz」スクリーニングの質問をコードゴルフしていました(この質問のポイントは、コードゴルフではなく、C演算子がどのように機能するかを理解することです。トピックから投票しないでください^^ ")、この行を思いつきました:
puts(&"Fizz\0FizzBuzz"[i%15?i%3?9:0:5]));
私はただできると思ったので、これは私には少し不必要に思えます:
puts("Fizz\0FizzBuzz"+i%15?i%3?9:0:5));
しかし、最初のセグメンテーション違反はそうなるでしょうFizz
。私の質問は、文字列リテラルに単に追加するだけではインデックスを付けられないのはなぜですか?に加数をキャストしようとしましたsize_t
が、それは何の役にも立ちません。任意のchar *p
(またはそのことについては任意の型へのポインタ)の場合、p[n]
は単なる構文糖衣で(*p+n)
あり、(私は思う)&*p == p.
では、なぜ&p[n] != p+n
ですか?
編集:私はちょうど私のを捕まえていたことが判明しFizz\0FizzBuzz"+i%15
ました?:
。いまいましい演算子の優先順位。私はバカです。:)
コードの問題は、括弧がないことです。これは完全に正常に機能します。
puts("Fizz\0FizzBuzz"+(i%15?i%3?9:0:5));
元のコードでは、最初の?
:
演算子の条件は次のとおりです。
"Fizz\0FizzBuzz"+i%15
これはあなたが意図したものではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加