奇妙な言語機能


974

あなたの意見では、あなたが遭遇した最も驚くべき、奇妙な、奇妙な、または本当に「WTF」の言語機能は何ですか?

回答ごとに1つの機能のみを入力してください。


5
@gablin LISP区切り文字とPERL正規表現をJavaScript解析を使用して組み合わせた場合、WTFの90%がカバーされると思います...
Talvi Watia

回答:


1859

Cでは、配列に次のようにインデックスを付けることができます。

a[10]

これは非常に一般的です。

ただし、あまり知られていない形式(実際に機能します)は次のとおりです。

10[a]

これは上記と同じ意味です。


758
[10]手段*(+ 10)...と、10 [A]の手段*(10 +):)ためだという
ミシェルGokan

77
「Hello World」[i]を忘れないでください。またはi ["Hello World"]
Richard Pennington 2010年

167
または、もっと便利なのは、「0123456789abcdef」[x&0xf]
ディップスティック

17
@frunsi:常に期待どおりに動作します。ポインターの追加は、アドレスに対する単純な整数の追加とは異なります。問題のタイプがどのサイズであっても交換可能です。
R.マルティーニョフェルナンデス

12
@mcv-a [10]は "*(a + 10)"と同じです。ここで、式 "a + 10"はポインター演算です(そして、aはshortなので、例では、a + 10は 'start at aのアドレス、および10のショート(つまり、20バイト)を移動します。式10 [a]は "*(10 + a)"として解釈されます。 "10 + a" ポインタ演算であり、まったく同じ方法で処理されます。
Edan Maor

1292

JavaScriptの場合:

 '5' + 3 gives '53'

一方

 '5' - 3 gives 2

81
文字列に数値を追加するためにこの種の手法を使用してJavaScriptを初めて使い始めたときのことを覚えています。
Callum Rogers

112
+文字列の連結は恐ろしい
Matteo Riva

416
+連結の問題ではありません。弱いタイピングです。
FogleBird 2010年

270
@FogleBirdどちらも本当に問題ではありません。これは、2つの組み合わせと一貫性のない強制ルールです。
TM。

70
したがって、基本的に、文字列が含まれる場合、+は連結です。'123456'-456 = '123'のようなコードを記述できないのはなぜですか?それは興味深いでしょう。
Jimmie Lin

872

JavaScriptでは、次の構文

return
{
    id : 1234,
    title : 'Tony the Pony'
};

リターンundefinedの後に改行に起因する卑劣な暗黙のセミコロン挿入に構文エラーですreturn。ただし、以下は期待どおりに機能します。

return {
    id : 1234,
    title : 'Tony the Pony'
};

さらに悪いことに、これも機能します(少なくともChromeでは)。

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

構文エラーが発生しない同じ問題の変種は次のとおりです。ただ黙って失敗します。

return
    2 + 2;

225
セミコロンの挿入は、JavaScriptの最も有害な部分の1つです。

230
ユーザーが主に馬鹿者であるという想定に基づいて言語機能を設計する場合、常に問題が発生します。
Rob Van Dam

8
私は実際にその問題がありました。自分自身がc#開発者であるため、ブレースを新しい行に入れました。何が問題だったかを理解するのに何時間もかかった。私が問題を解決したときでさえ、あなたの答えを読むまで、私は問題が何であるかを知りませんでした!
ヒョードルハイドゥ

24
Nick Retallack:JavaScriptのCのような中括弧とセミコロンの構文のため、改行が重要であることはまったく明らかではありません。
Tamas Czinege

19
JavaScriptでプログラミングするときにCスタイルを使用することを想定していない場合は、JavaScriptスタイルのデザイナーがCスタイルの構文を選択するのはむしろおかしいです。
Ryan Lundy、

795

JavaScript真理値表:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

出典:Doug Crockford


237
JavaScriptに===演算子があるのは良いことです。
匿名の

65
それでは==、言語デザイナーの目にはどのような目的がありますか?
クリスS

137
混乱する人々。
Javier

123
==の意味があり===~=タイプの強制を許可するような別の演算子があった場合、それは良いことです。
TM。

18
@Otto実際、私たちはオタクなので、彼の例は==が対称的でないことを示しています。現時点では、二項関係の可換性がどのように指定されるかはわかりません。
PeterAllenWebb 2010年

660

CおよびC ++の3文字表記。

int main() {
   printf("LOL??!");
}

LOL|トリグラフ??!はに変換されるため、これは印刷され|ます。


71
早く!すべてのC / b /プログラマーに伝えてください!
EstebanKüber2010年

235
トリグラフはすごいです。なぜなら、誰も-これまで-何を見つけようとしないことが確実だからです。名前を知らずにGoogleから意味します。
zaratustra、2010年

56
トライグラフは、GCCではデフォルトで無効になっています。
サスタニン2010年

360
これらにより、「WTF演算子」を使用できます:(foo()!= ERROR)??!??!cerr << "エラーが発生しました" << endl;
user168715

57
導入されたとき、トリグラフは必要な悪でした。一部のプラットフォームでは、言語のキーとなる特定の文字が含まれていなかったため、「トリグラフ」または「Cコンパイラのステートメントの終わりにアセンブラを使用することはできません」のいずれかでした。「C ++プログラミング言語」のStroustrupの説明を確認してください。
Euro Micelli、2010年

573

自動ボクシングとJavaの整数キャッシュで楽しい:

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

説明

Javaソースコードをざっと見ると、次のことがわかります。

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

注: プロパティによって設定されない限り、IntegerCache.highデフォルトは127です。

自動ボクシングで何が起こるかは、fooとbarの両方が、明示的に作成されない限り、キャッシュから取得された同じ整数オブジェクトを使用foo = new Integer(42)することです。整数値を比較する適切な方法は、.equals;


31
理由を確認するために数秒かかりました... javaは-128から128までの値の整数インスタンスのプールを保持する必要があります。そうでなければ、新しい整数を割り当てますよね?
Mike Akers、2010年

18
ただし、新しいInteger(42)を指定した場合、プールのインスタンスは使用されないため、foo == barはfalseと評価されます
z-

10
可能な場合は常にIntegersの代わりにintsを使用しますが、何らかの理由でIntegersを使用する必要がある場合は、==の代わりに.equals()を使用する必要がありますか?
MatrixFrog

246
私はC#プログラマーです。

87
@Will:C#には非常によく似た問題があります。blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspxを
spookylukey

373

Neil Fraserの引用(そのページの最後を見てください)、

try {
    return true;
} finally {
    return false;
}

(Javaでは、動作はJavaScriptとPythonで明らかに同じです)。結果は読者への演習として残されます。

編集:この件については、次の点も考慮してください。

try {
    throw new AssertionError();
} finally {
    return false;
}

42
+1。どういうわけか、私はこれが陽気で、クスクス笑いを止めることはできません。
Outis

153
ありがたいことに、C#はそのような狂気を許しません...Control cannot leave the body of a finally clause
Richard Ev

64
これは、偽、戻りますか?それはWTFのように見えるかもしれませんが(おそらく1つ)、私はルールに従っています:以前にマシンをクラッシュさせない限り、最後に常に勝ちます。
Michael Stum

28
:公平を期すために、私はあなたが電源コードヤンクしない限り、最終的には常に勝利することを覚えておくためにTDWTFの素敵な説明を非難thedailywtf.com/Articles/My-Tales.aspx
マイケルStum

22
この場合、コードが何を返すかわかりません。しかし、私はあなたreturnfinally条項に入れてはならないことを確信しています。
jfs

325

APL(そのすべてを除く)、任意のプログラムを1行で記述する機能。

たとえば、APLの1行でのConwayのLife of Game

代替テキストhttp://catpad.net/michael/APLLife.gif

その行がWTFでなければ、何もありません!

そしてここにビデオがあります


19
私はAPLが大好きです。ああ、午後中ずっと半行のコードを書く喜び。表示される文字をプログラムできるキーボードを入手したときに最初に行うことは、再びAPLに慣れることです。
ダニエルC.ソブラル2010年

24
ギリシャ人の言語のように見えます。
Esko

45
@エリック:コードを書くことに喜びはあります。それは、そこにたどり着く方法ではなく、あなたが望むものだけについてです。コードを単一の式として表現すること。それは究極の完璧な刀のカットのようなものです。もちろん、本当の戦いではむしろ銃を持っていたいです。
Daniel C. Sobral

7
@Daniel:午後全体を使ってコード行を書き、1週間かけてコード行を読みます。;-)
ユルゲンA.エアハルト

93
APLは、SFアクション映画で見ると素晴らしいでしょう。「敵のミサイルのベクトルを再形成する...転置する... pi対数...グレードアップする-そして実行する!」とつぶやく3色の端末に座っている人を想像できます。続いて爆発と歓声が続きます。
ジョーイアダムス

321

C ++テンプレートを使用できる奇妙なことは、テンプレートを使用して「描画」された形状の面積を計算する「多次元アナログリテラル」で最もよく示されます。次のコードは、3x3の長方形に有効なC ++です。

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

または、3Dキューブの別の例:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

18
Eelis'アナログリテラルは素晴らしいですが、彼らは奇妙な言語のある機能、またはするだけの奇妙な方法使う機能は?

85
実際のWTFは、不正な形式のエラーによって生成されるコンパイラエラーです。
Andrew McGregor

6
EclipseでX、Y、Z軸を中心にリテラルを回転させることをサポートするAnalogLiteralsのバージョンがあるときに、再び起こしてください。これで、「ビジュアルプログラミング」に新しい真の意味が与えられます。
TheBlastOne 2010

2
oとLの順序と|の問題はありますか?
Ming-Tang

4
テンプレートは演算子のオーバーロードをクリエイティブに使用するため、順序付けが重要です。(実際のコードではこれを行わないでください。演算子を誤用するとコードが読みにくくなります)
josefx

292

Perlの多くの組み込み変数:

  • $#— コメントではありません
  • $0$$$?-ちょうど同じ名前のシェル変数のよう
  • $&、および$'-奇妙なマッチング変数
  • $"and $,—リストおよびセパレーターの奇妙な変数
  • $!errno数値のstrerror(errno)ように、文字列のように
  • $_- ステルス変数は、常に使用して見たことがありません
  • $#_ —最後のサブルーチン引数のインデックス番号...多分
  • @_ —現在の関数の(非)名前...多分
  • $@ —最後に発生した例外
  • %:: —シンボルテーブル
  • $:$^$~$-、と$=-出力形式とは何か
  • $.and $%—入力行番号、出力ページ番号
  • $/and $\—入力および出力レコード区切り記号
  • $| —出力バッファリングコントローラ
  • $[—アレイベースを0ベースから1ベースから42ベースに変更します。WHEEE!
  • $}まったく何もない、奇妙なことに十分です!
  • $<$>$($)-現実と効果的なUIDとGID
  • @ISA —現在のパッケージの直接のスーパークラスの名前
  • $^T —エポック秒単位のスクリプト起動時間
  • $^O —現在のオペレーティングシステム名
  • $^V —これはどのバージョンのPerlですか

それらがどこから来たのかはもっとたくさんあります。ここで完全なリストを読んでください


83
$[変数は、それらすべての最も邪悪です。
Brad Gilbert

24
Perl 6がperldoc perlvar5秒ごとにチェックしなくてもコード化できるものであれば、間違いなく感謝します。(私は半分の時間を私がそれをチェックすることを認めると言いますが、「私のためにこれを行うことができる特別な変数があることを知っています、私はそれを覚えていません...」= P)
Chris Lutz

17
の問題use English;は、それがRegExpのパフォーマンスに影響を与えることです。私はこれを補っていません。 perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@Dave:リンクしたページに-no_match_varsオプションがあるため、問題ありません。@Brad:$ [はとても悪です。その背後にある意図は悪、そうですが、それもうまくいきません!@Artem:from perlvar "数字、制御文字、または句読文字で始まるPerl識別子は、パッケージ宣言の影響を受けず、常にパッケージmainに含まれます。また、厳密な 'vars'エラーもありません。」つまり、@ $が作成され、厳密な条件の下でもエラーなしで割り当てられます。ああ!
rjh

4
@ブライアン:Perlインタープリターが文字列の意味をヒューリスティックに推測する状況があると公式文書自体が述べているときに、構文を学ぶことをどのように提案しますか?たとえば、/$foo[bar]/その[bar]部分は文字クラス@fooですか、配列の添え字ですか?恐ろしい答えのGrep perldata。
j_random_hacker 2010年

289

PHPによる文字列内の数値の処理。詳細については、別の質問に対するこの以前の回答を参照してください。

"01a4" != "001a4"

異なる数の文字を含む2つの文字列がある場合、それらは等しいとは見なされません。これらは数値ではなく文字列であるため、先行ゼロは重要です。

"01e4" == "001e4"

PHPは文字列を好みません。それはあなたの値を数値として扱うために見つけることができる言い訳を探しています。これらの文字列の16進文字を少し変更すると、突然PHPはこれらがもはや文字列ではないと判断し、科学表記法の数値(PHPは引用符の使用を気にしません)であり、先行ゼロは無視されるため同等です。この点を補強すると、PHPも"01e4" == "10000"同等の値を持つ数値であるため、PHPもtrueと評価されることがわかります。これは文書化された動作であり、あまり賢明ではありません。


56
===と!==を使用するだけです。緩やかな型の比較が必要でない限り、どちらを使用してもかまいません。
2010年

14
@Dykam、より完全な回答へのリンクをたどると、===演算子の使用に対処したことがわかります。
Dan Dyer

18
弱いタイピングストライキが再び!
gillonba、2010年

43
PHPが罪であることは常に知っていました。今まで、私はそれが許されない罪であることに気づきませんでした:D
トーマス・エディング

2
プログラミングの本やチュートリアルで===を使用するように技術者に教える必要があります。追加メモ:不適切に記述されたPHPアプリでは、同じ数値として解析されたものをパスワードとして提供できました。
Pepijn、2010

282

予約語を排除しようとしたすべての言語(PL / Iなど)に投票しましょう。

次のような面白い表現を合法的にどこに書けますか?

IF IF THEN THEN = ELSE ELSE ELSE = THEN

IFTHENELSE変数名です)

または

IF IF THEN THEN ELSE ELSE

IFは変数でTHENありELSE、サブルーチンです)


1
@クォーク:これは別の答えです!;)...(そして、はい、英語でプログラムできます。他の開発者に.pptとして展開してください。;)
Macke

28
@RoadieRichバッファローの1つのグループは明示的にバッファローからのものではなく、単に説明のないバッファローです。
ユルゲン・A.エアハルト

18
ジェームズがいたジョンは、教師により良い影響を与えた。
GameFreak

4
先日、ベンアンドジェリーズのアイスクリーム工場の工場の外で看板メーカーを見かけました。私は彼らの作品を批評し、ベンとアンド、アンド、ジェリーの間に十分なスペースがないと彼らに言いました。
トムガレン2010

9
多分それは将来の一時的なプログラムに必要になるでしょう。IF THEN = NOW && WHERE = HERE THEN WHEN = THEN ELSE NOW = ELSEWHERE
Kelly S. French

282

JavaScriptの8進変換の「機能」は、知っておくと良いものです。

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10

詳細はこちら


60
8と9を除いてすべての数値が機能するというバグに行き着きました!! クレイジーになりました!!! ブライアン、ありがとう!
ファルーズ

10
@矢田8進数の意味ですか?16進数は0xです。
luiscubal 2010年

48
そして、それがparseIntが(オプションの)追加の引数を取る理由です:)。
LiraNuna、2010年

10
先頭の0は8進数を意味します。8が有効な8進数ではないので、結果は0でなければならない
devio

22
...そしてparseInt( '010')-> 8は混乱を招くだけです。
Richard Gadsden

213

Cのダフのデバイス!

Cでは、switchステートメントでdo / whileをインターレースできます。このメソッドを使用したmemcpyの例を次に示します。

void duff_memcpy( char* to, char* from, size_t count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
    case 0: do{ *to++ = *from++;
    case 7:     *to++ = *from++;
    case 6:     *to++ = *from++;
    case 5:     *to++ = *from++;
    case 4:     *to++ = *from++;
    case 3:     *to++ = *from++;
    case 2:     *to++ = *from++;
    case 1:     *to++ = *from++;
            }while(--n>0);
    }
}

9
Duffのデバイスは、おそらくswitchステートメントがデフォルトでブレークを持たないのに十分な理由です;-)ただし、インターレーススイッチとループの他の適切な使用法はまだ見ていませんが、おそらく1つあります。ええと、はい、別の使い方があります。コルーチンとプロトスレッドです。
Frunsi

16
@frunsi:「Duffのデバイスは、switchステートメントがデフォルトでbreakしていないのはおそらく良い理由です」-常に一般的なケースをデフォルトにします。私は正確に。これが一般的なケースである言わないだろう
BlueRaja -ダニーPflughoeft

6
@mcvは、アセンブリコードとして読み取ろうとする場合におそらく最も簡単です。つまり、while最後のはへの(条件付き)JMPバックdoです。これにより、スキップdoしてループに入る理由を説明できます。
wds

14
Duff's Deviceは一般に、手動で行うよりもループ展開を(より適切に)行う方法を知っている最新のコンパイラーの通常のループステートメントよりもWORSEコードを生成することに注意してください。
Billy ONeal、

37
@frunsi:それを公開しているダフ自身は、次のような主張をしました:「これは間違いなく、スイッチがデフォルトでフォールスルーするかどうかの議論の議論を提供しますが、それが賛成か反対かはわかりません。」
SF。

204

Algolは名前で渡します(C構文を使用して示されています):

int a[3] = { 1, 2, 3 };
int i = 1;

void f(int j)
{
    int k;
    k = j;  // k = 2
    i = 0;
    k = j;  // k = 1 (!?!)    
}

int main()
{
    f(a[i]);
}

33
あなたがそれについて考えるなら、それは実際にはある種のねじれた意味を持っています
RCIX

90
これが究極の「参照渡し」です。
2010年

3
Scalaでも可能です(def f(j : => int)
Dario

10
だからこれはのようなもの... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }ですか?
Simon Buchan

2
それは実際には非常に簡単です。式から得られるアドレス(この場合は&a [i])を計算する小さなコード(通常は「サンク」と呼ばれるため、上記の私の駄洒落)を生成します。この関数へのポインターは呼び出された関数に渡され、パラメーターがアクセスされるたびに、この関数を使用して現在のアドレスが計算されます。
Richard Pennington、2010年

189

Pythonの場合:

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

WTFではありませんが、便利な機能です。


176
他のすべての言語にこの機能があることを願っています
vava

32
ほとんどすべてのクールなPython機能と同様に、GuidoはクールなLisp機能の構文をALGOL化したように見えます。:-)
Ken

4
Geoffrey、それは機能で(10 > 5 > 1) != ((10 > 5) > 1)、Pythonでも。
サスタニン2010年

18
また、評価(funct_a(5)+5 > b > funct_a(5))funct_a(5)1回だけなので、呼び出しは1回だけです。それは素晴らしい機能です!
Khelben

57
@Khelben:いいえ、funct_aその例では2回呼び出されます。b > funct_a(5) > cかかわらず、一度は対照的に、それだけで、呼び出されますb > funct_a(5) and funct_a(5) > c
Baffe Boyois、2010

189

Javaの場合:

int[] numbers() {
  return null;
}

次のように書くことができます:

int numbers() [] {
  return null;
}

23
うわー!その配列構文が設計されたとき、私は壁に飛ぶことができればいいのに!
Adam Paynter、2010年

29
私はこれを言うのが嫌いですが、WTFはC型システムの一貫した拡張です。C関数が配列を返すことが許可されている場合、それはそのようになります。より良いものは、読みやすくするための整合性違反です。「const char * var」対「char const * var」によく似ています。
Gordon Wrigley

15
@Adam-変数宣言で「int stuff []」と「int [] stuff」の両方が同様に許可されると考えると、それは実際に理にかなっています。メソッドの宣言でも同じルールが機能するだけです。
Brandon Yarbrough、2010年

2
@lImbus:実際には、const T*T const*等価です、それはだT* const、ポインタというconsts。また、私はフォントを嫌います。
Simon Buchan

3
結局のところ、numbers()[2]法的声明です。
badp

184

INTERCALは、おそらく最も奇妙な言語機能の概要です。私の個人的なお気に入りは、GOTOの(ほぼ)反対のCOMEFROMステートメントです。

COMEFROMは、コードの任意のポイントからCOMEFROMステートメントに実行状態を移すことができるという点で、GOTOのほぼ反対です。状態転送が発生するコード内のポイントは、通常、COMEFROMへのパラメーターとして指定されます。指定された転送ポイントでの指示の前または後に転送が行われるかどうかは、使用される言語によって異なります。使用する言語によっては、同じ出発点を参照する複数のCOMEFROMが無効であるか、非決定的であるか、ある種の定義された優先度で実行されるか、スレッドインターカルで見られるように並列実行または同時実行を誘導することさえあります。「COMEFROM x」ステートメントの簡単な例は、「トラップドア」として機能するラベルx(対応するCOMEFROMの近くに物理的に配置する必要がない)です。コードの実行がラベルに到達すると、COMEFROMに続くステートメントに制御が渡されます。ラベルの近くに制御が不可解にプログラムの別のポイントにジャンプするという表示がないため、これの効果は主にデバッグ(およびプログラムの制御フローの理解)を非常に困難にすることです。


16
かなり悪-ラベルをGOTOに変える。言語機能ハッカーが懇願するような音
RCIX

114
わかりました、しかしINTERCALはおかしいことになっています-これは本当に驚くべき「つまらない」ではありません。INTERCALコンパイラーは、PLEASE修飾子を十分に使用しないと、プログラムのコンパイルを実際に拒否する可能性があります。
Groo

10
AOPのような音:)
akuhn

6
最も驚かされるのは、「World of Commercial TI」のシステム要件分析で、COMEFROMが実際に使用例を説明するテキストファイルで使用されていることです。(真剣に:一部のアナリストは、MSのOfficeではなくOpenOfficeへの企業全体の移行を遅らせました。前者はリンクで必要な細分度の「comefrom」を適切に参照できなかったためです)
jsbueno

5
Groo:それは悪いです。あまりにも頻繁にPLEASEを使用すると、うなり声を上げるため、プログラムのコンパイルが拒否されます(C-INTERCALでは、PLEASE修飾子を使用するために、ステートメントの33%から66%が必要です)。
Vatine

160

実際には言語機能ではありませんが、実装上の欠陥があります。初期のFortranコンパイラーは、定数プールを使用して定数を実装していました。すべてのパラメーターは参照によって渡されました。たとえば、関数を呼び出した場合

f(1)

コンパイラーは、定数プール内の定数1のアドレスを関数に渡します。関数のパラメーターに値を割り当てた場合、プログラムで値(この場合は1の値)をグローバルに変更します。頭を引っかいた。


124
ああ。そして、2+2 できる等しく5(の非常に大きな値のため2、もちろん!)。
Alok Singhal、2010年

12
ええと、2のどの値が "2 + 2" == "5"になりますか?それがtrueになるために2が整数値をとることができるかどうかはわかりません。
アーロン

36
@earlz:どんなビットパターンの整数値としても巻き上げられると思います。一方、おそらくそのように5から4に設定できます(したがって、の値が小さい場合2+2は等しく5なります5)。
David Thornley、2010年

18
すみません、Alokですが、これは私たちが話している初期のFORTRANです。それは真実ではありません2 + 2 = 5。構文エラーになります。何が本当でしょうか2 + 2 .EQ. 5
David Thornley、2010年

3
Haskellでは、次のスニペットは5と評価されます: "2 + 2 = let in 2 + 2" :)
Tirpen

153

言語機能と見なせるかどうかはわかりませんが、C ++では、テンプレートに関連するほとんどすべてのコンパイラエラーによって、世界中の多くのC ++プログラマにかなりの量のWTFが毎日提供されます:)


15
それは大丈夫です。テンプレートに関連するほとんどのコードはすでに世界中にたくさんのWTFを作成しています。
Joris Timmermans、2010年

43
ああ、今来ます。`std :: basic_ostream <char、std :: char_traits <char>>&std :: operator << <std :: char_traits <char>>(std :: basic_ostream <char、std :: char_traits <char>への未定義の参照>&、char const *) '完全に読み取り可能です!
Matt Greer

10
5行のテンプレート関連のコンパイラエラーがありましたが、その最短は17000文字でした(テンプレート化されたプログラムでは、古典的な「xに一致しない」エラー)。それはWTFであり、そもそも機能ではありません。テンプレートは素晴らしいものです。
Andrew McGregor

111
エラーが発生していなくても、プロファイラーで最も時間がかかる関数を見つけてください。ああ見て、それはstd::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
rlbond 2010年

12
これはここに当てはまると思います:bdsoft.com/tools/stlfilt.htmlでSTLFiltをチェックして、出力を読みやすくします。
2010年

150

Cの多くの名前空間:

typedef int i;

void foo()
{
    struct i {i i;} i;
    i: i.i = 3;
    printf( "%i\n", i.i);
}

または文字で:

typedef char c;

void foo()
{
    struct c {c c;} c;
    c: c.c = 'c';
    printf( "%c\n", c.c);
}

これはどうやって一義的にコンパイルするのでしょうか!?
Earlz

13
列挙型と構造体の+1タグ識別子は、C imhoの最も混乱する部分です。構造体へのポインターをtypedefするイディオムが、構造体のように見える理由を理解している人はほとんどいません。
Tadeusz A.Kadłubowski10年

11
コンテキストが原因で、これらのiのすべてに明確な名前空間があるため、コンパイルされます。
Andrew McGregor

149

Pythonのホワイトスペース全体が私の最大のWTF機能だと思います。確かに、しばらくすると慣れてきますし、最新のエディターで簡単に処理できますが、過去1年間のほとんどのフルタイムのpython開発の後でも、それは悪い考えだと確信しています。私はその背後にあるすべての理由を読みましたが、正直なところ、それは私の生産性の邪魔になります。それほどではありませんが、それでもサドルの下のバリです。

編集:コメントから判断すると、コードをインデントしたくないと思う人もいます。それは間違った評価です。言語を問わず、また強制されているかどうかに関わらず、コードは常にインデントしています。私が気に入らないのは、コード行が含まれるブロックを定義するのがインデントであることです。そのためには、明示的な区切り文字を使用します。他の理由の中でも、明示的な区切り文字を使用すると、コードのカットアンドペーストが簡単になることがわかりました。

たとえば、4つのスペースがインデントされたブロックがあり、8つのスペースがインデントされているブロックの最後に貼り付けた場合、私のエディター(すべてのエディター?)は、貼り付けられたコードが8スペースブロックまたは外側のスペースに属しているかどうかわかりませんブロック。OTOH、私が明示的な区切り文字を持っている場合、コードが属するブロックとそれが(再)インデントされる方法は明らかです-ブロック区切り文字をインテリジェントに探すことでそうなります。

編集2:コメントを提供する一部の人々は、これは私が嫌いな機能であると思うか、Pythonを貧弱な言語にしていると思います。繰り返しますが、そうではありません。私はそれがあまり好きではありませんが、それは要点の外です。問題は最も奇妙な言語機能に関するものであり、これは非常に少数の(ただし> 0)言語を使用しているため、これは奇妙だと思います。


63
それがあなたの生産性の邪魔をすると、あなたの非Pythonコードは非常に読みにくいかもしれません...
Tor Valamo

27
Python以前はどの言語を使用していましたか?どのようにして他の人と一緒に作業でき、その言語をインデントしませんでしたか?インデントされていないコードをどの言語でも我慢できるだろうか?あなたは、ソースコードに視覚的な手がかりを必要としない天才に満ちた部屋で働いていましたか?
S.Lott

53
+1これ以上同意できませんでした。私の編集者(Emacs)が、何か別のもの(中括弧/開始、終了/名前など)に基づいてコードを自動的にインデントできない場合、それは深刻な愚かです。「より大きな」関数に対して行うリファクタリングのほとんどは、本当に悪い体験になる可能性があります。
Dmitry

83
これが取り決めです。他の言語でも、コードのブロックを強調表示して、エディタで適切にインデントすることができます。しかし、空白は当然のことながら適切なインデントであるため、Pythonではその機能を失います。したがって、コードを移動したり、リファクタリングしたりするのは困難です。そして、OPが「問題であると最初に主張した人」であると主張する人にとって、まあ私はしばらくPythonコードを維持する必要があり、今まさにこの理由でPythonよりも任意の言語を使用します。
Kendall Helmstetter Gelner、2010

38
Pythonの空白は気にしません。WTFは一貫して強制されていないということです。兄弟と一致している限り、インデントレベルとタブを混在させることができます。したがって、最初のインデントレベルは1つのスペースになり、2番目のレベルは2つのTABにすることができます。これは構文エラーではありません。
1

138

私はこれについて少し苦労しました:

1;

Perlでは、モジュールは何かtrueを返す必要があります


29
一部のモジュールは、ランタイム操作に基づいて値を返す場合があります。常にtrueを返す場合でも、それについて非創造的である必要はありません。returnvalues.useperl.at
匿名

8
Perlメモリが正しく機能する場合、モジュールからtrueを返すと、モジュールが正常にロードされたことが示されます。false値を返すことは、何かがうまくいかず、プログラムが実行されないことを意味します(キャッチされない場合)。
Barry Brown

これも有効なCステートメントであり、何も返されません。
sigjuice

24
マーク・ドミナス氏は、「'Cogito ergo sum';誰もが知っているように、可能な限りすべての宇宙で自明であることがほとんど使用されていません。これにより、最大限の移植性が保証されます。」
グレッグベーコン

PHP <?=1;?>は1を<?=true;?>返します。1を<?=false;?>返します。nullを返します。
Talvi Watia

135

Visual Basicの7つのループ構造について誰も言及していないことに驚いています。

For i As Integer = 1 to 10 ... Next
While True ... End While
Do While True ... Loop
Do Until True ... Loop
Do ... Loop While True
Do ... Loop Until True
While True ... Wend

こだわっているから!あなたの条件の前にあるあまりにも複雑!


47
彼らはそれを「WhileそしてWhend」にすべきだった。なぜなら、無声唇化されたベロア近似で「while」という単語を発音する人がいるからだ。そしてもちろん、それはより良く整列し、整列するコードは素晴らしいです。
dreamlax

43
なぜそんなに奇妙な行動をしているのですか?
Erik Forbes

48
ワオ。考えるとちょっと懐かしいです。私が初めてVBを使用したのは、9歳のときでした。私はスウェーデン出身で、当時は英語があまり上手ではありませんでした。スウェーデン語の "vänd"と呼ばれる言葉があります。これは、基本的に「折り返す」という意味で、「wend」と同じように発音されます。そのため私はそれは多くの意味があると思った... :)
Emil H

61
!VBにはありませんが、「Not」です。またはそれは?はい、そうではありません!
ブライアリー

7
はい、「ウェンド」は英語の単語であり、コースまたは方法に沿って進むまたは進むことを意味します(google.com/search?q=define%3A+wend)。それが助けになるか、傷つくかわかりません。
マイケルマイヤーズ

134

知らない人のためにbc、「任意精度の計算機言語」であり、特に関係する数値が大きい場合($プロンプトが)は、迅速な計算に頻繁に使用します。

$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032

bc長い間、標準のUnixコマンドでした。

「WTF機能」について説明します。これはman bc(私の強調)からです:

quit:quitステートメントが読み取られると、quitステートメントの場所に関係なく、bcプロセッサは終了します。 たとえば、「if(0 == 1)quit」はbcを終了させます。

halt:haltステートメント(拡張)は、bcプロセッサが実行された場合にのみ終了するように実行されるステートメントです。 たとえば、「if(0 == 1)halt」では、停止が実行されないため、bcは終了しません。


41
私はこれにHaskellを使用しています。
Thomas Eding、2010年

8
グーグル計算機?
igul222 2010年

7
私は自分でPythonを使い始めており、インターネットに接続している場合はgoogle電卓が便利です。しかしbc、以前はそれを使用bcしていたため、manページからのすばらしい引用があったため、私の投稿について書きたかったのです。
Alok Singhal、2010年

6
@ブライアン、あなたは好きになるでしょう:(echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dcあなたはすでにこれを知っているかもしれませんが)。
Alok Singhal、2010年

2
私はirb(Ruby対話型シェル)を使用しています。しかし、昔はいつもdcのようなものでした-bcのようですが、リバースポリッシュを使用しています。オタク!
tragomaskhalos、2010年

134

私はいつも最も単純なプログラムがなぜなのか疑問に思っていました:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

それが可能性があるのに対し:

print "Hello World!"

たぶん、これはそもそもコンピュータサイエンスの学生を怖がらせるためのものです...


34
一部の言語では、「Hello World!」有効なプログラムです。
David Thornley、2010年

31
@SoMoS:Python、Ruby、Perlなどのほとんどの動的言語では、「Hello World!」または、いくつかのマイナーなバリエーション(例:印刷ではなくプット)は、有効で完全なプログラムです。
Dave Kirby

36
@Loadmaster:「すべてのコードはクラスに属している」または「すべてのコードは関数に属している」は不必要な制約であるという意味でした
Jimmy

19
言語がオブジェクトの使用を強制するからといって、適切なオブジェクト指向プログラミングに使用されているという意味ではありません。JavaまたはC#で手続き的にプログラミングすることは完全に可能です。それが静的メソッドの目的です。
jdmichal

68
OOPはすべてがオブジェクトでなければならないという意味だと思う人が大好きです。
Tor Valamo、2010年

132

JavaScriptはオブジェクト指向ですよね?したがって、リテラル文字列と数値に対してメソッドを実行すると機能するはずです。のよう"hello".toUpperCase()3.toString()。2つ目は構文エラーであることが判明しました。なぜですか?パーサーは、ドットの後に続く数値が浮動小数点リテラルであることを期待しているためです。それはWTFではありません。WTFは、ドットを追加するだけで機能します。

3..toString()

その理由は、リテラル3.がとして解釈され3.03.0.toString()正常に機能するためです。


8
Pythonでもこのように動作します(を試してください3..__add__(4))。それからもう一度私(3).__add__(4)はそれを行うためのはるかに少ない脳の損傷を受けた方法だと思います:)
badp

49
(3).toString()を実行できます
ジョセフモンタネズ

13
@ Gorilla3D:ええ、でもそれは奇妙な言語機能ではありませんよね?
Theo

25
3.0.toString()目がかゆくなります。
Ben Blank

18
127.0.0.1.toInt()
2010年

130

JavaScriptの場合:

2 == [2]

// Even stranger
2 == [[[2]]]

// And down-right nutty
var a = { "abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true

幸運なことに、stackoverflow.comの親切な人たちがすべてを説明してくれました。JavaScriptで 2 == [2]を使用するのはなぜですか。


6
そのため、===代わりに使用する必要があります。
ガンボ

10
これは便利です。数値を返す関数があり、それを使って追加のメタデータを返したい場合は、追加のフィールドを追加して[number]を返すことができます。単純なコードは、それが実数ではないことを決して認識せず、他のコードは必要なメタデータを取得できます。
Andrey Shchekin、2010年

36
@Andreyは、もしあなたが提案したことをするコードを維持しなければならないなら、私はすぐにその作者の死を望みます。
ブルトン語

@アンドレイ、それは素晴らしいアイデアです!を使用Number(n)して同様のことを行うこともできます。残念ながら、当社のソリューションの両方で===休憩=(。
シャビ

5
+1:私は自分を知識豊富なjsプログラマだと思っていましたが、これについては知らなかった:D
Thomas Eding

126

私の最大の嫌いな機能は、条件付きロジックを含む構成ファイルの構文です。このようなことは、Javaの世界(Ant、Mavenなど)で蔓延しています。

結局、限られたデバッグと限られたエディタサポートで、ac ** p言語でプログラミングすることになります。

構成にロジックが必要な場合は、構成を実際の言語でコーディングする「Pythonの」アプローチの方がはるかに優れています。


24
TclはPythonが生まれるずっと前に再発明し、Lispはその前にそれを発明しました。Pythonicとは呼ばないで、Emacs風と呼びましょう。
slebetman、2010年

46
それを右と呼びましょう。
mletterle 2010年

30
アーメン。構成またはビルド言語が完全に整っている場合、それは間違っています。CMake / autotoolsを見ています。
ジョセフガービン

16
これは、Luaが設計されたものとまったく同じです
Cogwheel 2010年

1
コードがPythonで記述されている場合は、構成ファイルをPythonファイルにすることをお勧めします。ファイルをインポートして、モジュールの属性を読み取るだけだからです。そして、あなたはあなたの設定ファイルでPythonの100%チューリング完全な力を手に入れます。
asmeurer 2011年

113

powerbasic(www.powerbasic.com)にはコンパイラディレクティブが含まれています。

# BLOAT {bloatsize}

これにより、コンパイルされた実行可能ファイルのサイズが<bloatsize>バイト単位で増加します。これは、実行可能ファイルを作成する人が生成された実行可能ファイルの小さなサイズが気に入らない場合に備えて、コンパイラに配置されました。EXEは肥大化したプログラミング言語と競合するために大きく見える:)


9
あはは 開発者が意図的にいくつかの操作(検索など)を遅くしていると聞きました。似たようなものだと思います。
David

42
これは最近読んだことを思い出します。彼らはFPSをテストしていて、悪者が持っていたヒットポイントの数を増やすことにしました。それから彼らはテスターに​​彼らのAIがどのようなものであるかを尋ねました、そして彼らはそれがはるかに賢いと誓いました。しかし、AIは変わらず、ヒットポイントだけが変わりました。人々は頭の中に世界についての特定の物語を持っています、そしてあなたが彼らの期待を理解して一致させれば、彼らはそれが彼らの物語を正当化すると仮定するでしょう。
Nate CK

5
私は以前、プログラムに多くの減速を追加して、プログラムが複雑なことをしているように見せていました。小学校に戻りました。
Matti Virkkunen、2010年

3
学校に戻ったときは80286台のマシンがあり、実際に妥当な速度(つまり、クロールしない)を得るには、いくつかの画面出力ルーチンをアセンブリで作成する必要がありました。
バーカス

7
@ネイトCK、AIがAIを披露するのに十分な長さである場合、それ実際にはより賢いかもしれませんが、それが死亡する前にそれを証明することができないかもしれません。
zzzzBov 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.