web-dev-qa-db-ja.com

i、j = 1は本当に誤解を招くのですか?

1つのライナーでの複数の変数の初期化に関する一般的な議論があります。

たとえば、int i、j = 1を考えます。一部の人々は、両方の変数が初期化されていると誤解していると思われるかもしれません

私たちは誰かが自分の言語の構文をそれについて誤解しないように十分に知っているべきだと主張することができます。別の議論は、私たちが多くの言語を学ぶ開発者として、言語間の特異性の間で間違いを犯す可能性があります。

しかし、その非常に特殊なケースでは、構文i、j = 1が両方の変数を初期化する言語も存在するのですか?

そうでない場合、その引数は適用されません。

11
Walfrat

私はそうは思いませんが、それは重要ではありません。重要なのは、i, j = 0i = j = 0と間違われやすいことです。これはdoesの両方を初期化します。明快さは正しさの次にソースコードの最も重要な要件であり、この質問が発生するという事実は明快さが次善であると証明します。

37
Kilian Foth

私は、あなたはどちらの側でも議論することができると思います:

  • コントラi, j = 0
    数学者はこれを使用して、ijの両方がゼロであることを意味します。

  • プロi, j = 0
    オペレーターの優先順位を知ることは簡単なことです。そして、それらの優先順位に疑問がある場合は、今こそそれを調べる時です。

    括弧なしでa.b += c[i]*d[i];のようなものを書くのも同じ理由です。もちろん、これは(a.b) += ((c[i])*(d[i]));と同等ですが、プログラマーは最もよく使用される演算子の優先順位を暗記し、不明な場合は演算子の優先順位を調べることが期待できます。したがって、括弧は、演算子の優先順位が規定するものとは異なる評価順序を強制しない限り、一般的に役に立たないと考えられます。

    もちろん、例外はあります。 <<+の優先順位は、どちらの場合でも括弧を保証するのに十分あいまいであると一般に見なされています。しかし、それはルールを証明する例外です。

私は、一つには、プロ側にもっと落ちるでしょうが、私はそのような宣言を禁止するどんなスタイルガイドにも固執する用意があります。それは争うに値する問題ではありません。