どの言語機能が有害と見なされますか?[閉まっている]


20

理由説明し、(誤)機能が実装されている言語をリストしてください。

嫌いなものではなく、有害な機能と思われるものを投稿してください。



2
@sbiまた、同じページ「XMLHttpRequestが有害と見なされます」を読むこともできます...
HoLyVieR

1
それらはすべて、基本的な表現を除いて、誰かまたは他の人によって有害と見なされます。
デビッドソーンリー


3
@David Thornley:a = 1/0-基本的な表現、有害。;-)
10

回答:


37

PHPでグローバルを登録する

情報:http : //php.net/manual/en/security.globals.php

これは、読みやすさとセキュリティ上の理由から、これまでに実装された最悪の機能です。基本的に、受信したすべてのGETパラメーターは変数に変換されます。

たとえば、次のURLの場合:/index.php?value=foobar

次のことができます。

<?php
echo $value; // return foobar
?>

コードを読んでいるとき、変数がどこから来たのかを知ることは非常に混乱します。

また、機能が悪用された場合、セキュリティホールにつながる可能性があります。php.netのコード例を次に示します。これは、誤用の可能性を示しています。

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

それは恐ろしいです。私は望みを理解できますが、デフォルトでそれを維持することはまったく意味がありません
でした-TheLQ

14
PHP 5.3(2009年)に廃止され、PHP 6で完全に削除されますが、人々は、レジスタグローバルがPHP 4.2(2000年ずっとバック)するので、デフォルトでは有効になっていないことに注意して強調されるべきで、まだバックを続けます10年経った今でも「OMGレジスタグローバル」へ。

1
かなり絶望的なPHP
明唐

@SHiNKiROUそれは絶望的ではありません。その機能は非推奨であり、PHP 6で削除されます
。– HoLyVieR

1
それは絶望的ではありません、他の言語よりもはるかに遅れているため、誰もがそれを使用する唯一の理由は、最近まで他の言語よりも安価なウェブホスティングを入手することがずっと簡単だったからです。
直観

22

デフォルトではNullを許可します。これは「兆」*ドルの間違いです。ごめんなさい、トニー・ホア。地球上で利用可能なほぼすべての言語。

トニー・ホアが説明する

*トニー・ホアによって造られた表現を調整して、最近の実際の損失を反映させました:-)


これは機能や間違いではなく、機能の欠如です。NULL不可の参照型を持つことは、言語に簡単にドロップできるものではありません。それには多くの考えと優れた設計が必要であり、コンパイラーと戦う気がしない方法で行うのは非常に難しいです。仕様番号と特異性は、それがどれほど難しいかを示しています。
imgx64

@ imgx86、いいえ、間違いです。null不可の参照型は、nullの間違いに応じて追加される機能で、通常nullを許可する型システムとの互換性を可能にします。
マットオレニック

@Kyralessa:おそらく彼はHoLyVieRがポピュリストバッジを取得することを確認したいのでしょうか?:-)同意します。このようなあなた自身の答えを受け入れることは意味がありません。
マクニール

18

CおよびC ++マクロ。誰かがマクロの標準関数名を選択してコードを台無しにしてしまうために、別のコンパイラエラーを確認する必要がある場合は、悲鳴を上げます。最後の問題のあるものを見てみましょう:

#define vector(int) new VARIANT[int];

ああ!私のSTLベクターで何をしましたか!?


名前空間は、typedefとテンプレートをすぐに使いやすくするものの1つです。
Shog9

4
同意しましたが、それは現代の言語がテキストマクロの機能の代替を見つけたからです。それらが発明されたとき、コンパイラ技術は非常に原始的だったので、マクロは良いことでした。
dsimcha

このマクロはどこで見つけましたか?
rwong

@dsimcha-私はこれについて知りません。Lispマクロは長い間存在しています。
ジェイソンベイカー

2
@Jason:まだ便利でクールなLispスタイルの「本物の」ASTマクロをノックしていません。純粋にテキストレベルで動作し、スコープの概念がなく、ばかげて漏れやすい抽象化と難読化されたコードを作成できるC / C ++スタイルのマクロのみが嫌いです。は、「実際の」マクロです。
dsimcha

14

CおよびC ++ switchステートメントのデフォルトのフォールスルー。


18
これは、私が書いたすべてのコードで常に役立つ機能です。これはどのように誤機能ですか?
-greyfade

6
@greyfade:breakステートメントを忘れるか、誰かが2つのケースの間にケースを追加する(またはそれらを再注文する)までの間、フォールスルーがあったことに気付かずに役立ちます。私はフォールスルーが良いなどの休憩や後藤場合、どちらかが必要なのC#の方法よりであることをどのような方法が表示されない
ティム・グッドマンの

9
ダフのデバイスはあなたの免責でsc笑します!
ジェシーC.スライサー

3
同意する。デフォルトでは良い機能ではありません。

11
誰も読みませんか?彼はデフォルトでフォールスルー
マットオレニック

13

変換される型に明確な関係がない場合の暗黙的な型変換。たとえば、PHPのように、ランダムな非数値stringをに変換intします。


7
一度頭を悩ませれば、この種の問題は問題にならないことに注意してください。ユーザーが入力した値の重要な領域でチェックを行わない場合にのみ本当に問題になりますが、たとえば、何かが数字になることを知っているが、文字列として来る場合は無限に役立ちます。たとえば、DBのフィールドは文字列として返される可能性が高いため、キャストについて心配する必要はありません。
タルカ

2
@Slokun:より良い例を思いつくことができますか?文字列型を使用して整数値をdbに保存するのはなぜですか?
スティーブンエバーズ

@SnOrfus URL、ユーザー入力、関数、および静的に型付けされていない言語に共通するその他のものに渡される数値を取得します。
TheLQ

引用符で囲まれた文字列の値は整数に変換できるポインターであるため、これもCの問題です。これにより、適切にコンパイルしても意味がないように見えるコンストラクトが作成される可能性があります。C ++では、キーワードを使用して変換関数を定義できますexplicit。これにより、暗黙的な型変換が停止しますが、まだ問題があります。
デビッドソーンリー

@TheLQ:ユーザー入力の場合は、それが数値であるかどうかを判断するために検証する必要があります。@Slokunが言ったように。ファイルからデータを読み込んでいる場合、数値データが本来あるべき場所にあると期待できますが、ディスク破損の場合に例外が発生する方が0、値をランダムにするよりも良い場合があります。
直観


11

なし

機能が頻繁に悪用されるからといって、それが有害になるわけではありません。

私見「全体が有害と考えられる」は、プログラミング言語の議論のReductio ad Hitlerumです。

すべてではないにしても、ほとんどの「有害な」機能は、非常に有効なユースケースを持っているか、元々持っていた、またはそもそも単に便利な方法です。長所と短所を理解し、それに応じてコードを作成するのは開発者次第です。

あなたの質問が「どの言語機能に一般的な落とし穴や不幸な副作用があるか」という方針に沿ったものである場合、私の答えは異なります。

[編集]明確にするために、私は非推奨のメソッドを継続して使用するつもりはありません。開発者が機能を減価償却/削除する場合は、代替品を使用する必要があります。言語の現在の部分は有害であると考えられるという概念に言及している。なぜなら、多くの人々が議論するように、それが奨励するものやその使用に伴うトレードオフを好まない人もいるからである。


13
私は同意しません、良い反例は私の答えです。PHPのレジスタグローバルは悪いだけで、使用方法は重要ではありません。これが廃止された理由であり、PHPの古いバージョンでは使用しないことを強くお勧めします。
HoLyVieR

5
+1間違った手で言えば、どんな言語構成要素も有害です。
ムービシエル

5
良い点は... GOTOSの95%が悪い場合でも、機能自体は、他の5%の静止価値がある
EDS

1
ラジオのオン/オフボタンの横にイジェクターシートボタンを置くようなものだと思います。機能自体は悪くないかもしれませんが、誤って使用しても害を防ぐことはできません。
LennyProgrammers

1
これは「銃は人を殺さない、人は殺す」に相当するプログラミングだと思います。
10

7

Autovivification(または他のbind-variable-on-(assign | use)機能)は、最も多くのバグを発見した機能です。


+1-イテレータシュガーに同意しないかもしれませんが、これは100%に同意できるものです。
ChaosPandion

7

PLEASEINTERCALで。十分に使用しないでください、と文句を言います。使いすぎると文句を言う。


2
その言語は真剣に使用されることになっていない。非常に「ユニークな」プログラミング言語になるように作成されたため、意味をなさないもの(たとえば、comfromから-私の頭の上の)がいっぱいです。
ShdNx

4
それは明らかだと思いましたが、はい、それは深刻な言語ではないことを認識しています。
アランピアース

2
申し訳ありませんが、一部の人々はこの辺ではあまりにも深刻です。
マークC

1
先週ウィキペディアでこの言語を発見したばかりで、その人気の高さに圧倒されました(まだO_Oではありません)。
オリバーワイラー

多くの「チャレンジ」言語があり、それらは常に人気があります。なぜなら、コーダーは追跡を愛するために仕事をする傾向があるからです。また、インタビューの質問では、意図的に鈍く、刺激的で、難しいと考えられているため、非常に人気があります。
10

7

一部の人々はこの男や彼が言うさまざまなことに異議を唱えていますが、ダグラス・クロックフォードのJavaScript:The Good Partsの多くは、基本的にこの質問がJSに当てはまることです。クロックフォードの苦情の中で:

  • すべての既定のグローバルスコープ(DCは、関数/オブジェクトを名前空間およびスコープ区切り文字として使用して、これを圧縮する方法を示しています。)

  • のようなステートメントでwith、その失敗動作はグローバル名前空間で物事を定義することです。(Gah!JSのモットーは、失敗した場合、可能な限り激しく失敗することです!)

  • ==演算子の予期しない動作。これは基本的に、常に===演算子を使用する必要があります。

  • セミコロン挿入。

本当に多くのJSは、おそらく言語全体でさえ有害であると見なされるべきですが、良い部分は非常に良いので、少なくともそれを補います(少なくとも私にとっては)。


6

デフォルト動作としてのFlash Playerでの「サイレントでの失敗」

OK、実際には言語自体の機能ではありませんが、それでもかなり密接に関連しています。

突然、Flash / Flexアプリケーションの動作が停止し、f *が発生したことを少しでも知ることができなくなります。エラーメッセージもスタックトレースも何もありません。突然画面遷移が起こらない(またはまったく間違った方法で起こる)、ボタンがクリックに反応しなくなる、またはコンボボックスがいくつかのエントリで埋められるのではなく空になっているだけです。

その「機能」だけが、いくつかの肩をすくめるレポートと、私が得てきた白髪の束の原因となっています。-.-ユーザーの顔に不可解なメッセージを表示することも望ましくありませんが、少なくとも開発者が問題を解決するのに役立ちます。

ただし、Flash Playerでは、ユーザーの説明に依存して、暗闇の中で突き刺さったままになります(一方、問題は、実際には、ユーザーが行っていたこととは関係のないコード内のまったく異なる場所に起因する場合があります)。Debug Playerを使用する場合にのみ、実際にエラーメッセージとスタックトレースを含むポップアップウィンドウが表示されます。

ただし、特定のニュースサイトでFlash埋め込みムービーを視聴し、使用されている埋め込みプレーヤーSWFからNull参照に関するメッセージを繰り返し受け取ることは非常に興味深い場合があります。:D


iPhoneはまた、特定の奇妙なタイミングで、時々警告なしにクラッシュするアプリ
明唐

3
何でも黙って失敗するのはかなりお粗末です。

6

C / C ++の場合:その割り当ても、非常によく似た割り当て=および比較==演算子と組み合わせた式です。それ自体は有害な機能ではありませんが、誤ってオペレーターをタイプミスすることにより、バグを簡単に導入する(時には微妙な)方法です。

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

...整数またはポインターが有効な条件であるという事実と組み合わせて。
バルジャック

5

パッケージのプライベート言語のデフォルトおよびプライベートプログラミング規則のデフォルトを使用したJavaの修飾子へのアクセス。


5

警告なしでシェルの未定義変数を空の文字列に置き換えますrm -rf $nosuchvar/*


+1 Argh!
LOL-

@Orblingのようなもの${varname:-/dev/null}は回避策かもしれません
...-デュロス

それは、使用前に変数の存在と内容を常に防御的にチェックする必要性を示しています。
10

4

ロゴで反時計回りに回転する機能。WTF、時計回りに回転させることができます360 - x


まあ、ロゴを使ってからしばらく経ちました。なぜこれが有害なのですか?
メイソンウィーラー

5
ロゴを使用して、実際の物理的なカメロボットを制御できます。時には、あなたはしたいカメが特定の方向をオンにする、または複数回オンにします。たとえば、あなたはそれを何らかのダンスをするようにプログラミングしているかもしれません。
ダニエルキャシディ

@メイソン、冗談になるはずだった。
jjnguy

3
ええ、特に時計のロゴでは。
直観

1
私はLogoが大好きで(programmers.stackexchange.com/questions/21028/…を参照)、特に若者向けの優れた教育言語です。私が11と言って最初にロゴを使用したとき、私のクラスのほとんどはそれほど多くのジオメトリを知りませんでしたが、彼らは90が4分の1ターンであり、右から左を知っていると言われました。したがって、否定的な機能ではありません-除算演算子を使用する代わりに逆数を乗算しない理由と同じです。はい、冗談です。
10

4

他のスレッドからのスレッドの停止

Javaおよび他の言語では、停止したスレッドが適切に終了する時間を与えることなく、他のスレッドから任意にスレッドを停止できます。この機能は、ほぼすべての状況で発生する可能性がある膨大な量の問題を考慮して廃止されました。


これ有害であると思われます、非常に役立つ場合があります(たとえば、シングルステップとブレークポイントをサポートするデバッガー)。
ジェリーコフィン

1
@Jerryのデバッグはまったく別のものであり、プロセスを停止せず、一時停止します。
HoLyVieR

むしろ逆に、スレッドを停止します。どうやら、あなたはスレッドを停止するだけでなく、スレッドを殺すことについて話しているようです。それは...正当化するために少し難しいです
ジェリーの棺

ただし、これは必ずしも言語機能であるとは思わない。もっと標準的なライブラリのこと。
ジェイソンベイカー

4

PHPの変数

あなた$canがあなたを意味しないという理由だけで$$should


1
利用可能(潜在的に危険な)機能を持っていつものように、Perlは...、それをオフにする簡単なベストプラクティスの方法(持っているuse strict)、あなたは(それをしたいと思います正確な場合には、再びオンにするための簡単な方法をno strict 'refs')。

1
動的変数名を使用することはありません。そして、私が行った唯一の時間は、コードを読みにくくし、数か月後にコードを再訪したときのWTFの瞬間でした。
TheLQ

うーん、アプリケーションには、他の人々の不快なパッケージ変数またはシンボルテーブル(これは少し違うと思います)によるメタプログラミングが含まれています。

1
@Joe 変数変数がソリューションを明確にする1つの例を示すように挑戦します。
ケンダルホプキンス

1
コメント冗談意図したものでした。申し訳ありませんが、私はそれを明確にしませんでしたが、ここで尋ねるのは変数変数が解を明確にする最良の例です。私はそれがむしろ悪い例であることを認めます。
ジョーD

3

WithDelphi のステートメントが思い浮かびますが、役に立つ場合もあります。


私はラザロにデルファイから何かを移植し、私のTControlの子孫が含まれているとき、これは誤ってコンパイルされたコードにつながって良い場合は、「キャンバスで...幅、高さん」コントロールのサイズを参照しますが、ラザロのTCanvasは、自身の幅とDelphiを持っていました
マクシー


2

Perlでは、スカラーコンテキストとリストコンテキストは注意が必要です。特定の操作を便利にするいくつかの良い点がありますが、時折、演算子の意味を完全に変えるようなひどい何かに出くわします可能性(コード内のかなりの距離から)。

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

それは正しくありません。

(それは通常の範囲演算子のように振る舞う何かを作ろうとすることから生じるので、ループのように何かを言うことができますnext if /start_regex/ .. /end_regex/)。


とても混乱している男。Perlを学ぶことで最悪だったのは、それを回避しようとしたことです。
グレナトロン

関数が複数の方法で戻ることを可能にするものは何でも便利だといつも思っていました。
10

2

Python 2.xの相対的なインポート構文。のx.pluginsさまざまなライブラリのサポートを追加するパッケージがあるとしますx。そして、私はsqlalchemyサポートをに追加できるようにsqlalchemyモジュールを持っているとします。次の行をsqlalchemy.pyに追加するとどうなりますか?x.pluginsx

import sqlalchemy

答えは、モジュールが自分自身をインポートしようとすることです。この構文は、本質的に、実際のグローバルsqlalchemyパッケージのインポートを不可能にします。Python 2.5では、これが相対的なインポートであることを指定する方法が追加されました。

from . import sqlalchemy

...しかし、最初の構文が実際に削除されたのはPython 3になってからです(ただし、Python 2.6以降ではを使用して無効にできますfrom __future__ import absolute_import)。


1

sun.misc.unsafeは私の一番のお気に入りです。「ものを実装するためにこれが必要でしたが、実際には、あなたはそれを使うべきだとは思わない」というコレクション。


7
すべての優れた言語に、標準ライブラリに安全でないパッケージが必要です。このパッケージをインポートすると、低レベルの移植不可能なことを行う意図が明確に示されます。選択肢がある:1-(例えばC ++)言語自体に安全でない機能を有する2-(例えばPythonとルビー)低レベルのことを行うためのCのような別の言語を使用すること。安全でないパッケージのアプローチは、私にははるかに良いようです。
imgx64

1

FORTRAN共通ブロック。単純な間違いを犯した場合、アプリケーションのある部分が別の部分のグローバルを破壊する可能性があります。

FORTRANが割り当てたgotoステートメント/ COBOL alterステートメント。自己修正コード。危険、警告、スパゲッティモンスターの飛行!!


FORTRANにはALTERステートメントがありませんでした。FORTRANには、割り当てられたGOTOを持つASSIGNステートメントがありました。COBOLにはALTERステートメントがあり、これは同様の目的に役立ちました。
ジョンR.ストローム

@ジョン-ありがとう。assign / alterの私の記憶は薄暗いです...特に使用しないように教えられたからです。
スティーブンC

1

オブジェクトの向き(静的に型付けされたすべての言語から)。この機能には、nullポインターよりもはるかに高いコストがかかること、そして今後もかかることを期待します。オブジェクト指向は、動的なメッセージ受け渡し言語でのみ有効です。したがって、Pythonのような動的言語からもドロップする必要があります(メッセージパッシングを使用せず、従来のサブルーチン呼び出しを使用するため)。


Pythonは(すべての意図と目的のために)smalltalkのメッセージパッシングイディオムをサポートしています。それはそのように名付けられていません。第二に、このような一般的な言語機能を有害と呼ぶことは、少なくとも少し議論の余地があると思います。
ジェイソンベイカー

オブジェクト指向により、コードの再利用とコード/データのカプセル化が改善されます。機能の静的/動的使用に関係なく。
10

@Orbling:何と比較して?私の意見では、関数型プログラミング言語はコードの再利用率が高く、Haskellのモジュールシステムはコード/データのカプセル化に非常に適していると思います。
LennyProgrammers

@ Lenny222標準の命令型プログラミングと比較。私も機能的なアプローチを好みます。Haskellは私の好みの言語です。
オーブリング

@Jason Baker:それは確かに議論の余地がありますが、あまりにも広まっていることがまさにそれを非常に有害にしているのです!OPは私の意見を求めましたが、私はそれを与えました。たくさんのレミングスが崖を飛び越えても、行動が正気にならないからです。この場合、OOPが機能しないことが数学的に証明されており、正しいパラダイムが受け入れられています。カテゴリ理論は抽象化を表す方法です(実際には抽象化の理論です)
Yttrill

1

magic_quotes PHPで

未経験の開発者は、有効化されているため、SQLクエリで使用するためにすべてのユーザー入力がエスケープされると想定するか、無効化されているため、常に入力をエスケープします。

有効になっていると想定し、そうでないシステムでコードを実行すると、大きなSQLインジェクションホールが開きます。

無効であると仮定すると、バックスラッシュが実際にDBに保存され、い/正しくない文字列が発生します。

両方のケースを処理する非常に簡単な方法もありません-使用して有効になっているかどうかを確認し、配列内のすべての値にget_magic_quotes_gpc()適用する必要があります- 再帰的ではないため、このためのカスタム関数が必要です。stripslashes()$_*array_map


または、パラメータ化されたクエリを使用することもできます。
ピーターB

それでも、魔法の引用符が有効になっていて、予期していなかった場合は、バックスラッシュが表示されます。
シーフマスター

-3

プログラマーがコメントなしまたは無意味なコードを書くことを可能にする言語機能。


1
そして、これを修正する方法は?
マニエロ

1
@bigown:comment-or-die機能を実装することにより:D。
tia

3
それはLiterate Programmingと呼ばれます。en.wikipedia.org/wiki/Literate_programming
バリーブラウン

2
これは機能ではありませんが、ユーザーフロントエンドで非常に有名なバグです。ほとんどの人は、ラテン語名Homo Sapiensでそれを知っています。
ジョーD

-3

ここで手足を少し外に出ます-void関数。関数は常に何かを行うため、結果またはその成功または失敗に関するその他の情報を返す必要があります。


3
Pascalには、プロシージャ(戻り値なし)と関数(戻り値)がありました。
ジョンオンストット

関数は常に何かを(だけでなく、通常は、プレースホルダ機能誰?) 、しかし頻繁にそれについて誰にも言わする必要はありません。
10

-4

基本的なPOKE ...


7
POKEは最高でした。
Shog9

2
初期の頃は、特定のことを基本的に達成できる唯一の合理的な方法は突くことでした。Appleの音楽] [頭に浮かぶ
ビル

2
私が正しく覚えていれば、コモドール64でPOKEなしでは多くのことはできませんでした。
MetalMikester

1
両方とも不可欠なPEEKを忘れないでください。
10

-5

ガベージコレクションを言わなければなりません。メモリ管理について考える必要性を排除するものではありませんが、メモリ管理について考える必要性の認識を排除します。これは、実際の思考を排除することが多すぎるため、リソースを大量に消費し、その理由がわからなくなります。特に、現代の世代別GCの動作は、とにかく「設計による1つの大きなメモリリーク」と誇張しすぎずに説明できる場合です。


2
コレクションのどこかに参照が存在する場合、他の問題があります。
チンメイカンチ

2
それが、GCされた言語に弱い参照がある理由です:)
Chinmay Kanchi

4
GCには確かに長所と短所の両方がありますが、メイソンはこの点で間違っているよりもはるかに正しいと言わざるを得ません。実際、GCを使用している人々は、事前に計画するのではなく、事後にハッキングしようとするため、メモリ管理に余分な時間を費やしているのを見てきました。また、GCは通常、決定論的な破壊を防ぎます。これにより、メモリ以外のすべてのリソースの管理に余分な作業が必要になります。
ジェリーコフィン

3
@ChaosPandion:最新のマルチタスクマシンで、ページングがシステムパフォーマンスを破壊しないようにするために、メモリをできるだけ早く解放すべきだと思うなら、私は本当にばかですか?GCはその結果を達成することさえできませんでした。実際、世代別ガベージコレクターは、現在最も優れていると考えられている世代別ガベージコレクターとは正反対です。最高のパフォーマンスを得るには、できるだけ遅くメモリ。私は他のプログラムを遅くするときではなく、どんな仕事にもこれまでにない適切なツールだとは思いません。私はそのためにばかですか?
メイソンウィーラー

2
@Barry:プログラム内で決定論的です。5 KBのメモリブロックを使い終わったら、すぐに別の5 KBを要求しますが、どうなりますか?ガベージコレクションシステムでは、GCが暫定的に実行されない限り、完全に良好なブロックが未使用のままであっても、新しい5 KBブロックを要求する必要があります。その場合、古いブロックをリサイクルできます。mallocとfreeを使用すると、常に古いブロックをリサイクルできます。これに数十万を掛けると、実際の問題になります。
メイソンウィーラー

-5

C、そして間違いなくC ++:ポインター演算。人々が整数をメモリアドレスに変換できるようにすることは、問題を求めています。

そして、ポインタへの生のアクセスもありますか?

C ++には、ポインターがほぼ完全に不要になる参照があります。残りの場合、スマートポインターは必須と見なされる必要があります。

Javaは、ユーザーがポインター値自体にアクセスすることを許可せずに、ポインターを使用するプログラミング言語を作成できることも証明しています。

null... とは別に、それは別の話です。


5
ポインターは、時には適切に使用するのは困難ですが、非常に多くの効率的なメモリ操作のために非常に必要です。
ビル

1
本当です。しかし、私の意見では、人々が定期的に整数をメモリ参照に変換したり、メモリアドレスに数値を追加したりすることはほとんど有害です。C ++には、完全に優れた代替手段としての参照と、ポインターであることが本当に必要な場合のスマートポインター/自動ポインターがあります。
Asgeir S.ニルセン

4
この回答は、ポインターを隠すように構築されたソフトウェアスタックで作業している場合にのみ有効です。では、すべての他の例、この答えは間違っています。
ポールネイサン

3
一部のプログラミング言語では、他のプログラミング言語用のすべてのオペレーティングシステムと仮想マシンを作成できるように、ポインターを使用可能にする必要があります。

2
-1。ptr算術演算が必要な理由があります:ポイントの反復はインデックス付けよりも高速です。for(int i=0;i<SIZE;++i) ++arr[i]はより遅いですfor(int*i=arr;i<arr+SIZE;++i)*i++。証明できるすべてのjavaは、ポインターが必要なのか、それとも見たことがないのかということsun.misc.Unsafeです。ポインターが必要ない場合は、Javaを使用して汎用スワップ関数を作成する方法を説明してください。(例:int a = 1、b = 2; swap(a、b); assert(a == 2 && b == 1);)。参照を使用する必要があった場合に発生するc / c ++のすべての問題は言うまでもありません。不透明な構造体のポインターなしの仮想関数をどのように呼び出しますか?
KitsuneYMG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.