ホームページ  >  記事  >  バックエンド開発  >  プログラマーを混乱させる 10 の言語機能

プログラマーを混乱させる 10 の言語機能

伊谢尔伦
伊谢尔伦オリジナル
2016-11-25 09:59:251559ブラウズ

各言語には、独自の機能、独特の構文、珍しい関数、または非標準の実行方法があります。そのため、初心者でも経験者でも、ある特集を見ていると突然酔ってしまうことがあります。この記事では、よく言われる10の「奇妙な」機能をまとめています。

1. Javascript: + はコネクタです

問題の説明: JS では、+ 記号は数値の間に使用され、通常の加算として使用できますが、文字に遭遇した場合は、文字コネクタとしても使用できます。例: '1' + 1 の結果は 11 です。

原因分析:

根本的な理由は、JS が弱い型付け言語であることです。たとえば、Python も文字コネクタとして + 記号を使用しますが、Python は厳密に型指定された言語であるため、整数に文字が追加されると、これがエラー操作であることを示すプロンプトが表示されます。

ネチズンの意見:

「問題は、これが予測できない必須のサイレント変換であり、無視されやすいことです。」 匿名

「JS は例外をスローすることでこの状況を処理する必要があります。」 crgwbr

「実行するには + を使用してください。」文字の連結は単に悪夢です。」Matteo Riva

2. Perl: モジュールは TRUE 値を返さなければなりません

問題の説明: ほとんどの場合、Perl モジュールは 1 で終了する必要があります。それ以外の場合、戻り値は です。最後のステートメントが TRUE ではない場合、システムはエラーを報告します。

原因分析:

Perlモジュールには初期コードとサブルーチンが含まれています。モジュール ファイルがロードされると、Perl は TRUE が返されるかどうかに基づいてコードが正常に実行されたかどうかを判断します。初期コードがない場合でも、Perl は最後のステートメントが TRUE を返すことを期待します。そうでない場合は、エラーが報告されます。

これは、三文字言葉の用法です)

問題の説明:

例えば、システムは??!を見た場合は自動的に | に変換し、??(を見た場合は自動的に変換しますto [. これにより、予期しない結果が簡単に発生し、コードの可読性が大幅に低下します

原因分析:

プログラミングの初期には、中括弧などの特定の特殊文字をキーボードで直接入力できませんでした。この間接的な方法が使用されました

ネチズンからの意見:

「Google ほどの知識があるなら、何を理解できないはずですか??!??!」 C は曖昧になり、理解するのが難しくなりました。」 Martin Beckett

4. PHP: 大文字と小文字を区別する処理

問題の説明:

PHP の大文字と小文字の処理は、ある場所では区別され、他の場所では区別されません。例: 変数名と。定数名は区別されますが、関数名、メソッド名、クラス名は区別されません

原因の分析:

おそらく、成熟したプログラミング言語に設定された CGI スクリプトから PHP の開発中に生じた成果物です。

ネチズンの意見:

「これが、PHP プログラマがアンダースコアではなくアンダースコアを使用して関数に名前を付けることに慣れている理由です。」paperstreet7

PHP では、すべてが可能です。 : true 値としての 0

問題の説明:

Ruby では、0 値は TRUE 値と同等です

原因分析:

ブール値のみ。 FALSEとnilはFALSEに相当し、残りは2、3などと同等に扱われます

ネチズンの意見:

「意図は良いのに、これは単純に腹立たしい。 .” Chris Lutz

「0==true! ほぼ崩壊したC言語脳です!」 Kenny

6. Python: レベルをスペースの数で分割する

キーワードや句読点の使用とは異なります。 PY は、コードの各行を明確に分割するためにインデント レベルを使用します スペースの数が間違っている (または、スペースと転置文字の数が一貫していない) と、プログラムがエラーを報告する可能性があります

原因分析:

PY 作成者の意図は、コードを作成することですプログラマ自身がコードの明瞭性を維持する責任を負うべきだと思います:

「誠実に、これが私が PY から離れている根本的な理由です。」このような強制メカニズムが本当に必要です。本当に怠け者なのでしょうか。 "Joris Meys

7. C: 配列インデックスの動作モードはポインタの動作モードと同等です

問題の説明:

C では、a[i] と i[a] は交換可能で、両方の記述方法で同じ結果です。

原因分析: Cでは、メモリブロックの配列とポインタに違いはありません。つまり:

a[i] = *(a + i) = *(i + a ) = i[a].

ネチズンの意見:

「C言語のわかりにくいコード競争ではこれは価値がない。 "混乱

" "これにより、C 言語の核心、ポインター、およびメモリをより直接的に扱うことが明らかになったと思います。 ” Michael Neale

8. Perl の: 定義済み変数

問題の説明:

Perl には非常に長い特殊変数のリストがあり、その中の名前は非常に複雑です (ただし、対応する長い英語の単語もあります)。したがって、上級 Perl 開発者でない限り、Perl ドキュメントを繰り返し読むのが一般的です。

原因分析:

これらの変数は、プロセス ID ($$)、エラー メッセージ ($@)、正規表現の一致 ($^R) など、さまざまな意味を持ちます。

ネチズンの意見:

「とても迷惑だ!」 MatrixFrog

「合理化された開発者にとっては恩恵になるかもしれない。」 niXar

「これらの変数の問題は、Google では見つけられないことだ!」 JavaScript: セミコロンの自動挿入

問題の説明:

JS はステートメントの終わりの記号としてセミコロンを使用しており、コードが壊れてもセミコロンを自動的に挿入します。これは多くの場合エラーにつながります。

原因分析:

自動化の本来の目的は、特に初心者に利便性をもたらすことです。

ネチズンの意見:

「言語機能を設計するときに常にユーザーを愚か者だと見なしていると、問題が発生します。」Rob Van Dam

「JS で最も厄介なのは、fennec

の 1 つです。」

10. Java: オートボクシングと整数キャッシュ

問題の説明:

Java は、int を An Integer オブジェクトに変換するなど、基本型データをオブジェクトに自動的に変換します (オートボクシング)。同時に、デフォルトでは、キャッシュされた Integer オブジェクトの値は -128 ~ 127 です。この場合、 == を使用して、同じ値を持つ 2 つの Integer オブジェクトを比較するときに問題が発生します (-128 と 127 内は TRUE、残りは FALSE)

原因分析:

自動ボックス化メカニズムにより、コード入力が削減されます整数キャッシュにより処理速度が向上します。

ネチズンの意見:

「幸いなことに、私は単なる C# プログラマーです。」 Will

「これは間違いではありませんが、数値処理にプリミティブ型 (ブール値など) を使用する理由になります。」ラビワラウ

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。