i、j = 1は本当に紛らわしいですか?[閉まっている]


11

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

たとえば、int i、j = 1; 一部の人々は、両方の変数が初期化されていると誤解する可能性があります

誰かが自分の言語の構文を十分に知って、それについて間違えないようにする必要があると主張できます。別の議論は、開発者が非常に多くの言語を学習し、言語間の特異性の間で間違いを犯す可能性があることです。

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

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


2
言語が正しければ、初期化されていない変数にアクセスするとコンパイラエラーが発生するため、潜在的な混乱は無害です。
CodesInChaos

4
@CodesInChaos Cは正気ではないと言っているのですか?
Baldrickk

2
言語が何かを許可しているからといって、人間が不必要な痛みを引き起こしていないわけではありません。このコードが要求される唯一の場所は、言語仕様を覚えていない人を罰するために設計されたクイズ中です。私はいつもこの種の質問に失敗しました。ブレー。
candied_orange

2
Visual Basic 6 Dim Apple, Orange, Pear as Fruitでは、法的な宣言です。VBを知らないとします。あなたの第一印象AppleはタイプFruitですか?そうではない。言語は多くの場合、その言語の専門家ではない人々によって読まれます。あなたが専門家である場合、専門家でない人にもあなたの意図を明確に伝えるために、言語を賢く使用してください。どの言語でも複数の初期化を使用しません。
エリックリッパー

13
同様にvar x = 1, y = 1.5; 、これは次と同じかint x = 1; double y = 1.5;、同じdouble x = 1, y = 1.5;ですか?varC#3.0に追加したとき、私は世論調査を行い、約半数の人が前者は「明らかに」正しいと信じ、残りの半分はもう一方は「明らかに」正しいと信じており、違法にしたことを発見しました。人口の半分を完全に誤解させる機能は、悪い機能です。
エリックリッパー

回答:


37

私はそうは思いませんが、それはポイントではありません。ポイントは、i, j = 0非常に簡単に間違えられることでi = j = 0、両方を初期化ます。明快さは、正確さの次にソースコードの最も重要な要件であり、この疑問が生じるという事実は、明快さが次善であることを証明しています。


3
私はまた、そのようなステートメントが両方のステートメントを初期化しない場合、なぜそれも存在するのだろうと主張しますか?
ベリンロリッチ

2
@BerinLoritschは言語に依存します。これは、宣言の巻き上げのためにJavaScriptで頻繁に行われます。コードで使用される場所まで変数を初期化しない場合でも、変数が使用可能なスコープの最上部で変数を宣言することは多くの人にとってベストプラクティスと考えられています。ほとんどすべてのコード変換ツールがこの方法で出力します。
ジャレッド・スミス

1
コード出力ツールがこれを実行した場合、それは信頼できるはずであるため、それは一つのことだと思います。ただし、人間に対しては、最後の要素の宣言と初期化を1行のみで結合することをお勧めします。発生を待っているバグのように見えます。
ベリンロリッチ

2
@JaredSmith Maple以外に、これが現在望まれている言語は考えられません。Cでさえ、潜在的なバグを止める利点を与え、コンパイラーは、機能が変わらない限り、変数をどう処理するかを決定します。これにより、より少ないレジスタで処理できるので、より良い最適化が可能になります。
18年

6
言語に関係なく、1は「何を尋ねるべき利益の書き込みのint i, j=1int i; int j = 1(またはさらに良く、別の行)は?」
-chepner

2

私は、どちらの側についても議論できると思います:

  • KONTRA i, j = 0
    数学者は、両方のことを意味するためにこれを使用して行うiとがjゼロとなっています。

  • 利点i, j = 0
    演算子の優先順位を知ることは簡単です。そして、あなたが彼らの優先順位について疑わしいなら、今こそそれを調べる時です。

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

    もちろん、例外があります。優先順位<<とは+、一般的に、いずれの場合もwarant括弧に曖昧十分に考えられています。しかし、それはルールを証明する例外です。

私は、1つには、Pro側にもっと陥りますが、そのような宣言を禁止するスタイルガイドに固執する用意ができています。争うに値する問題ではありません。


7
演算子が含まれてint i, j = 0;いないことに注意してください。そのステートメント内の唯一のがあり、したがって演算子の優先順位は含まれません。パーサーは、コンマ演算子または割り当て演算子として扱いません。むしろ、これらは宣言文の文法的な部分です。0,=
エリックリッパー

@EricLippert優先ルールに関する限り、その違いは関係ありません。私が知っているCスタイル言語は、宣言で他の式と同じ優先順位を使用します。それ以外のものは災害を招きます。
cmaster-モニカの復元18年

but programmers can be expected to know the precedence of the most used operators by heart、 あなたは言う。あなたが与える例では、ほとんどの(平均的な)プログラマーがメンバーアクセス演算子または配列インデックス演算子を数学的な意味での演算子と考えているかどうかはわかりませんが、代わりに自然言語の名詞と乗算と考えます動詞としての演算子。だからこそint i, j, k = 0;の自然言語アナログとして、それプレゼント「I、J、Kとint型の変数は、宣言され、0に設定されなければならない」ので、そのような悪魔のような構造であります!
スティーブ

@Steveプログラマーとしての優先ルールを覚える方法は、あなた次第です。それらを言語の名詞と考えるのに役立つ場合は、それを行います。ただし、その場合、のようなものを見ると問題が発生します*a[i]。「名詞」の類推でそれを十分に解析できるとは思いません。に関してはint i, j, k = 0;、ルールを調べなければ何でも意味があります:3番目の解釈は、宣言int iしてから評価jして最後に割り当てることk = 0です。あなたの言語の構文を知らない限り、そのような構造を解析することはできません。とにかくそれがあなたの問題です。
cmaster-モニカの復元18年

@cmaster、私は特定の暗記戦略を表現していませんでした。私はCプログラマーではないので、Cでの演算子の優先順位に関する私の知識は二流です。しかし、あなたの例を見て私が指摘したのは、乗算演算子が配列インデックス演算子に相対的な優先順位を持っているとは考えていなかったということです。つまり、にa[i]適用されるインデックス演算子としてa読んだのではなく、乗算演算子のオペランドを指定する既約の構文要素として両方を読んだため、優先順位を評価するように促されることさえありませんでした。(1/2)
スティーブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.