プログラミング言語の11の予期しない機能

世界には多くのプログラミング言語があり、それぞれに独自の小さな癖があります-奇妙な構文、異常な機能、または非標準の実装です。 初心者だけでなく、経験豊富な開発者も混乱させることがあります。 これらの癖が言語の学習を真剣に止めたり、逆に有名なチップになることがあります。



プログラミング言語には似たようなものがたくさんありますが、最も有名なものを選択しました。



Oracle SQLの空白行





画像提供:Nic Hughes CC BY 2.0



Oracleは、NULLと同等の長さゼロの文字列を考慮します。 これは、他のデータベースおよびANSI / ISO標準SQLとの大きな違いです。これは、空の文字列が既知の値であり、NULLが不明であり、同等ではないことを意味します。 これは、複数のRDBMSのコードを記述したりコードを書き換えたりするときに頭痛の種になります。



SQLの最初のバージョンがリリースされた1979年に混乱があり、対応する標準はまだ開発されていませんでした。 ただし、Oracleは、近い将来、このような空白行現象がなくなる可能性があると警告しました。



引用:



「はい、これは「すばらしい」Oracle DB機能の1つです」 -Lukas Eder

「空の文字列は、0以下のNULLと同等です」- ベンブランク

「何!? Oracleを使用していないことをとてもうれしく思います。 怖いです。」- ジェフ・デイビス



+ JavaScriptのユニバーサル連結演算子として





画像提供:MicroAssist CC BY-SA 2.0



+演算子はJavaScriptでオーバーロードされ、数値の数学的な加算と文字列の連結の両方の役割を果たします。 つまり、一方のオペランドが小文字でもう一方が数値の場合、1 + 1 = 2の代わりに '1' + 1 = '11 'が得られます。JavaScriptは警告なしに数字を文字列に導きます。



この理由は、型の互換性を制御できないことです。 たとえば、Python +ではまったく同じ目的で使用されますが、数字と文字を加算することはできません。



引用:



「問題は、式での潜在的な型キャストが予測できないことです。」- 匿名

「この場合、JavaScriptは例外をスローする必要があります」 -crgwbr

「+文字列の連結は悪夢です」 -Matteo Riva



PerlモジュールはTrueを返す必要があります





画像提供:アンソニーケリーCC BY 2.0



Perlの各モジュールはtrueを返す必要があります。 これが行われない場合、開発者はカルマを大きく損ない、コンパイルエラーが発生するリスクがあります。



この理由は、Perlでモジュールが何であるかを理解していれば、明確で理解しやすいものです。 コンパイルプログラムは、コードに接続されたモジュールを考慮して、まず最初に実行可能性をチェックします。 モジュールに初期化コードがなくても、Perlは出力でTrueを受け取ることを期待しています。



引用:



「このことでいつも気分が悪くなる」- ドリューホール

「継続的な刺激を考えると、これは実用的ではありません。」- シュヴェルン



CおよびC ++のトライグラフ





画像提供:REUTERS / Gary Hershorn



CおよびC ++言語は、3文字表記(自動的に1文字表記に変換される3文字表記)をサポートしています。 したがって、たとえば、組み合わせ??! あげます あなたのコードを読むことに決めた教育のない敵を混乱させたい場合は、角括弧の代わりに??(および??)の組み合わせを使用します。



トライグラフの意味は、言語開発者がコードを難読化するという願望ではありませんが、かつては多くのキーボードに、現在中かっこなどの現在普及している記号が含まれていませんでした。



引用:



「リクエストで何かを検索しても、Googleは役に立ちません??!??!」- Isaac

「誰もが3文字表記を嫌っているので、C99は代替として2文字表記をもたらしました...さらに難読化しています」 -dododge

「3文字表記の喜びにより、1977年以来Cは読めなくなりました。」- Martin Beckett



PHPの大文字と小文字の区別





画像提供:Gregg O'Connell CC BY 2.0



ほとんどのプログラミング言語は大文字と小文字を区別しますが、PHPでは、関数、クラス、およびメソッドの名前は大文字と小文字を区別しません。 しかし、開発者にとって最も印象的なのは、変数、定数、およびクラスプロパティの名前で大文字と小文字が区別されることです。



この矛盾がどこから来たのかは定かではありませんが、最も可能性の高いオプションは、CGIインターフェースを個別の本格的なプログラミング言語に分離するというPHPの作成者の最初の要望です。



引用:



「まあ、これはPHPです。 驚かないでください」 -Grzechooo

「だからこそ、PHPプログラマーはCamelCaseの代わりにアンダースコアを使用して、関数を呼び出しています。」- paperstreet7

「プログラミング言語を作成する方法がわかりません...」-PHP作成者Rasmus Lerdorf

「PHPで困惑させないものはありますか?」- ラムダフェアリー



RubyのTrue Zero





画像提供:DaveBleasdale CC BY 2.0



Ruby 0 == TRUEの場合。 これは予期しないことであり、PythonやCなど、他のほとんどの言語とは異なり、0は依然としてFALSEであり、Rubyの初心者を混乱させることがよくあります。



その理由は、Rubyでは、ブール値falseとnull(nil)のみがFALSEで評価されるためです。 それ以外はすべて重要です。 0は他の数字と同様に考慮されます。



引用:



「それが良いとは思わなかったのは変だろう。」- クリス・ルッツ

「だからこそ、Rubyが大好きです。 私はそのようなゼロ偽の悪に対処する必要はありません。」- Edditoria

「0 == true // argh、私の頭の中のCコンパイラが爆発した!!」- kenny



Pythonのスペース





画像提供:Paul Kitchener CC BY 2.0



Pythonは、句読点やキーワードの代わりに、インデントを使用して、コードの行が属するブロックを示します。 スペースが正しくない、またはスペースとタブが混在していると、エラーが発生する可能性があります。



この言語の作成者は、多くのエディターとIDEが自動的にインデントするため、コードを読みやすくし、押されるキーの数を減らすことを目指しました。



引用:



「いいえ、本当です。これは私がPythonを愛することを妨げるものです」 -wazoox

「Pythonのインデントは大好きですが、ニュアンスがあります。インターネットからコードをコピーして貼り付ける場合、多くの場合、追加のクリーニングが必要になります」 -Greg

「面付けインデントが必要な場合、あなたは怠け者です」- オリス・メイズ



Cの配列はポインター演算に従う





画像提供:BlueGum CC BY-ND 2.0



配列要素への参照を[i]として取得できるという事実に加えて、i [a]として取得できます。



その理由は、Cの配列はメモリブロックへのポインタであるため、a [i] = *(a + i)= *(i + a)= i [a]です。



引用:



「... C ...難読化コンテストに参加すると非常に貴重です...」- 混乱

「私はこれを機能とは考えていません。Cコアを見るだけです。すべては、ポインタとメモリへのできるだけ迅速なアクセスを目的としています。 ある意味、それは美しいです。」- マイケル・ニール



Perlの事前定義変数





画像提供:Emily Mathews CC BY 2.0



Perl言語の説明を注意深く読んでいると、かなり多くの定義済み変数を見つけることができます。それには、おおまかに言って、奇妙な名前が付いています(ただし、かなり長い英語に相当します)。



それらは、情報を提供したり、プログラムのさまざまな側面へのアクセスを提供したりします。 したがって、たとえば、$ @はエラーメッセージ、$$はプロセス識別子、$ ^ Vは使用されるPerlのバージョンです。 多くの場合、初心者はドキュメントを調べる必要があります。



引用:



「非常に迷惑」 -MatrixFrog

「ところで、シングルライナー向けのクールなもの」 -niXar

「最悪なのは$ @と@ $だと思います。 両方とも機能しますが、2番目の機能が何であるかまだわかりません...」- Artem Russakovskii

「ところで、これらの変数にはまだ深刻な問題があります:それらはグーグルではありません!」- malvim



JavaScriptにセミコロンを自動的に挿入する





画像提供:Nate Angell CC BY 2.0



JavaScriptでは、完成した各式の最後にセミコロンが必要です。 これが行われなかった場合、たとえば空の文字列になった場合、JavaScriptはこれを開発者の不注意とみなし、セミコロンを挿入します。これは役立つ場合がありますが、多くの場合、プログラムのエラーや予期しない動作につながります。



当初、セミコロン挿入は、新しい開発者がCに似たJavaScript構文を簡単に作成できるようにすることを目的としていました。



引用:



「ユーザーがバカだと思って言語を開発すると、間違いなく問題が発生します」 -Rob Van Dam

「ヒント:セミコロンの適切な場所を見つけて配置します。 これが最高です。」- ダグ・クロックフォード

「セミコロンの挿入はJavaScriptの最悪の部分の1つです」 -fennec



Javaでの自動パッキングと整数キャッシュ





画像提供:Erich Ferdinand CC BY 2.0



Javaは、プリミティブをオブジェクト(たとえば、整数のint)に自動的にパックします。 一般的には問題ありませんが、値が-128から127の間にある場合、整数がキャッシュされます。両方のオブジェクトの値が-128から127の場合、プログラムはTRUEの値を割り当てるため、それ以外の場合はfalse。



オートボクシングはコード量を削減し、整数キャッシュはパフォーマンスを向上させます。 しかし、落とし穴について覚えておく必要があります。



引用:



「これは時期尚早な最適化の結果です」 -Joschua

「これはよくある間違いではありませんが、数値や論理変数などにネイティブJava型を使用する正当な理由です。」- Ravi Wallau

「C#で書いてとてもうれしい」- ウィル



翻訳著者:イリヤ・ブブノフ

___



PS方向を選択し、GeekBrains Webサイトで上記の技術のいずれかを使用して学習を開始できます。



All Articles