Seltsamste Sprachfunktion


974

Was ist Ihrer Meinung nach das überraschendste, seltsamste, seltsamste oder wirklich "WTF" -Sprachenmerkmal, auf das Sie gestoßen sind?

Bitte nur eine Funktion pro Antwort.


5
@gablin Ich denke, wenn Sie LISP-Begrenzer mit PERL-Regex unter Verwendung von Javascript-Parsing kombinieren würden, würden Sie 90% der WTF abdecken ...
Talvi Watia

Antworten:


1859

In C können Arrays folgendermaßen indiziert werden:

a[10]

das ist sehr häufig.

Die weniger bekannte Form (die wirklich funktioniert!) Ist jedoch:

10[a]

was das gleiche wie oben bedeutet.


758
Das liegt daran, dass a [10] * (a + 10) bedeutet ... und 10 [a] * (10 + a) :)
Michel Gokan

77
Vergiss nicht "Hallo Welt" [i]. Oder ich ["Hallo Welt"]
Richard Pennington

167
Oder sinnvoller "0123456789abcdef" [x & 0xf]
Ölmessstab

17
@frunsi: Es funktioniert immer wie erwartet. Das Hinzufügen von Zeigern ist nicht dasselbe wie das einfache Hinzufügen von Ganzzahlen für Adressen. Es ist kommutativ, egal welche Größe der betreffende Typ ist.
R. Martinho Fernandes

12
@mcv - a [10] ist dasselbe wie "* (a + 10)", wobei der Ausdruck "a + 10" Zeigerarithmetik ist (und da a ein Kurzschluss ist, bedeutet in Ihrem Beispiel a + 10 "Start bei" a's Adresse und verschiebe 10 Shorts, dh 20 Bytes '). Der Ausdruck 10 [a] wird als "* (10 + a)" interpretiert, wobei "10 + a" auch Zeigerarithmetik ist und genauso behandelt wird.
Edan Maor

1292

In JavaScript:

 '5' + 3 gives '53'

Wohingegen

 '5' - 3 gives 2

81
Ich erinnere mich, als ich anfing, Javascript mit dieser Art von Technik zu verwenden, um Zahlen in Zeichenfolgen hinzuzufügen: "111" - - "222" ergibt 333, während "111" + "222" "111222" ergibt.
Callum Rogers

112
+für String-Verkettung ist schrecklich
Matteo Riva

416
+ für concat ist nicht das problem. Schwaches Tippen ist.
FogleBird

270
@FogleBird Keiner von beiden ist wirklich das Problem. Es ist nur die Kombination der beiden mit inkonsistenten Zwangsregeln.
TM.

70
Im Grunde genommen ist + concat, wenn eine Zeichenfolge beteiligt ist. Warum können sie so etwas wie '123456' - 456 = '123' nicht codieren? Das wäre interessant.
Jimmie Lin

872

In JavaScript das folgende Konstrukt

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

returnundefined ist ein Syntaxfehler aufgrund der hinterhältigen impliziten Einfügung von Semikolons in die neue Zeile danach return. Folgendes funktioniert jedoch wie erwartet:

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

Schlimmer noch, dieses funktioniert auch (zumindest in Chrome):

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

Hier ist eine Variante desselben Problems, die keinen Syntaxfehler verursacht, sondern nur stillschweigend fehlschlägt:

return
    2 + 2;

225
Das Einfügen von Semikolons ist einer der bösesten Teile von JavaScript.

230
Sie stoßen immer auf Probleme, wenn Sie Sprachfunktionen unter der Annahme entwerfen, dass Ihre Benutzer meistens Idioten sind.
Rob Van Dam

8
Ich hatte tatsächlich dieses Problem, da ich selbst C # -Entwickler war, habe ich die Klammer in eine neue Zeile gesetzt. Ich habe Stunden gebraucht, um zu erkennen, was das Problem war. Selbst als ich das Problem gelöst habe, wusste ich nicht, was das Problem war, bis ich Ihre Antwort gelesen habe!
Fedor Hajdu

24
Nick Retallack: Aufgrund der C-ähnlichen Syntax von geschweiften Klammern und Semikolons in JavaScript ist es überhaupt nicht ersichtlich, dass Zeilenumbrüche von Bedeutung sind.
Tamas Czinege

19
Wenn Sie beim Programmieren in JavaScript keinen C-Stil verwenden sollten, war es für die JavaScript-Sprachdesigner eher pervers, eine Syntax im C-Stil zu wählen.
Ryan Lundy

795

JavaScript-Wahrheitstabelle:

''        ==   '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

Quelle: Doug Crockford


237
Gut, dass Javascript dann den Operator === hat.
Anonym

65
Welchen Zweck erfüllt ==der Sprachdesigner?
Chris S

137
Leute verwirren.
Javier

123
Es wäre schön, wenn == es die Bedeutung von hätte ===, und dann gab es einen anderen Operator, so etwas ~=erlaubte Typenzwang.
TM.

18
@Otto Tatsächlich zeigt sein Beispiel, dass == nicht symmetrisch ist, da wir uns auf die Suche machen. Im Moment habe ich nicht gesehen, wie die Kommutativität für eine binäre Beziehung angegeben wird.
PeterAllenWebb

660

Trigraphen in C und C ++.

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

Dies wird gedruckt LOL|, da der Trigraph ??!in konvertiert wird |.


71
Schnell! Sagen Sie es allen C / b / Programmierern!
Esteban Küber

235
Trigraphen sind erstaunlich, denn Sie können sicher sein, dass niemand herausfinden wird, was ??! wird von Google bedeuten, ohne den Namen bereits zu kennen.
Zaratustra

56
Trigraphen sind in GCC standardmäßig deaktiviert.
Sastanin

360
Mit diesen können Sie den "WTF-Operator" verwenden: (foo ()! = ERROR) ??! ??! cerr << "Fehler aufgetreten" << endl;
user168715

57
Trigraphen waren ein notwendiges Übel, als sie eingeführt wurden. Einige Plattformen enthielten nur keine bestimmten Zeichen, die für die Sprache von entscheidender Bedeutung waren. Es handelte sich also entweder um "Trigraphen" oder um "Sie können kein C-Compiler-Periodenende haben, also verwenden Sie Assembler". Lesen Sie die Beschreibung von Stroustrup in "The C ++ Programming Language".
Euro Micelli

573

Spaß mit Auto-Boxing und dem Integer-Cache in 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

Erläuterung

Ein kurzer Blick auf den Java-Quellcode zeigt Folgendes:

/**
 * 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);
}

Hinweis: Der IntegerCache.high Standardwert ist, 127sofern nicht durch eine Eigenschaft festgelegt.

Was beim automatischen Boxen passiert, ist, dass sowohl foo als auch bar dasselbe ganzzahlige Objekt aus dem Cache abrufen, sofern es nicht explizit erstellt wurde: foo = new Integer(42)Wenn Sie also beispielsweise die Referenzgleichheit vergleichen, sind sie eher wahr als falsch. Die richtige Methode zum Vergleichen des Integer-Werts ist die Verwendung.equals;


31
Ich habe ein paar Sekunden gebraucht, um zu sehen, warum ... Java einen Pool von Integer-Instanzen für Werte zwischen -128 und 128 aufbewahren muss, andernfalls wird eine neue Integer zugewiesen, oder?
Mike Akers

18
Beachten Sie jedoch, dass bei Angabe einer neuen Ganzzahl (42) die Instanz aus dem Pool nicht verwendet wird, sodass foo == bar
z -

10
Ich verwende immer Ints anstelle von Ganzzahlen, wenn möglich, aber wenn ich aus irgendeinem Grund Ganzzahlen verwenden musste, sollte ich einfach .equals () anstelle von == verwenden?
MatrixFrog

246
Ich bin so froh, dass ich ein C # -Programmierer bin.

87
@ Will: C # hat einige sehr ähnliche Fallstricke. Siehe blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
spookylukey

373

Zitat von Neil Fraser (siehe Ende dieser Seite),

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

(In Java ist das Verhalten in JavaScript und Python anscheinend gleich). Das Ergebnis bleibt dem Leser als Übung überlassen.

EDITIERT: Solange wir uns mit dem Thema befassen, bedenken Sie auch Folgendes:

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

42
+1. Aus irgendeinem Grund finde ich das lustig und kann nicht aufhören zu kichern.
Outis

153
Zum Glück erlaubt C # solchen Wahnsinn nicht ...Control cannot leave the body of a finally clause
Richard Ev

64
Das kehrt zurück, falsch, oder? Es mag wie eine WTF aussehen (und möglicherweise ist es eine), aber ich lebe nach der Regel: Endlich gewinnt immer, es sei denn, Sie stürzen die Maschine vorher ab.
Michael Stum

28
Um fair zu sein, ich beschuldige TDWTFs nette Erklärung, sich daran zu erinnern, dass letztendlich immer gewinnt, wenn Sie nicht am Netzkabel ziehen: thedailywtf.com/Articles/My-Tales.aspx
Michael Stum

22
Ich bin nicht sicher, was der Code in diesem Fall zurückgeben soll. Aber ich bin absolut sicher , dass Sie nicht setzen müssen returnin finallyKlausel.
JFS

325

APL (außer ALLES), die Fähigkeit, jedes Programm in nur einer Zeile zu schreiben.

zB Conways Spiel des Lebens in einer Zeile in APL :

Alternativtext http://catpad.net/michael/APLLife.gif

Wenn diese Zeile nicht WTF ist, dann ist nichts!

Und hier ist ein Video


19
Ich liebe APL. Ah, die Freude, einen ganzen Nachmittag damit zu verbringen, eine halbe Codezeile zu schreiben! Das erste, was ich tun werde, wenn ich eine Tastatur bekomme, auf der ich programmieren kann, welche Buchstaben angezeigt werden, ist, mich erneut mit APL vertraut zu machen.
Daniel C. Sobral

24
Sieht aus wie eine Sprache für Griechen.
Esko

45
@Erik: Es macht Freude, Code zu schreiben, bei dem es ausschließlich darum geht, was Sie wollen, und nicht darum, wie Sie dorthin gelangen. Ihren Code als einen einzelnen Ausdruck auszudrücken. Es ist wie der ultimative perfekte Katana-Schnitt. Natürlich hätte ich in einem echten Kampf lieber eine Waffe.
Daniel C. Sobral

7
@ Daniel: Du verbringst einen ganzen Nachmittag damit, eine Codezeile zu schreiben ... und eine ganze Woche damit , eine Codezeile zu lesen . ;-)
Jürgen A. Erhard

93
Es wäre großartig, APL in einem Science-Fiction-Actionfilm zu sehen. Ich kann mir vorstellen, dass jemand an einem dreifarbigen Terminal sitzt und murmelt: "Den feindlichen Raketenvektor umformen ... transponieren ... pi-mal Logarithmus ... hochstufen - und - ausführen!" gefolgt von Explosionen und Jubel.
Joey Adams

321

Die seltsamen Dinge, für die C ++ - Vorlagen verwendet werden können, werden am besten durch "Multi-Dimensional Analog Literals" demonstriert, die Vorlagen verwenden, um den Bereich "gezeichneter" Formen zu berechnen. Der folgende Code ist in C ++ für ein 3x3-Rechteck gültig

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

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

Oder ein anderes Beispiel mit einem 3D-Würfel:

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

18
Während Eelis' analog Literale groß ist, sind sie eine fremde Sprache - Funktion , oder einfach nur eine seltsame Art und Weise zu verwenden , eine Funktion?

85
Die echte WTF ist der Compilerfehler, der von einem der fehlerhaften generiert wird.
Andrew McGregor

6
Wie krank ist das ... weck mich wieder auf, wenn es eine Version von AnalogLiterals gibt, die das Drehen des Literal um die X-, Y- und Z-Achse in Eclipse unterstützt ... das würde "visueller Programmierung" eine neue wahre Bedeutung geben.
TheBlastOne

2
Ist die Reihenfolge der O's und L's und | 's wichtig?
Ming-Tang

4
Die Reihenfolge ist wichtig, da die Vorlagen die Überladung von Operatoren kreativ nutzen. (Tun Sie dies nicht mit echtem Code, da der Missbrauch von Operatoren das Lesen von Code erschwert.)
Josefx

292

Perls viele integrierte Variablen:

  • $#- kein Kommentar!
  • $0,, $$und $?- genau wie die gleichnamigen Shell-Variablen
  • , $&Und $'- seltsam passende Variablen
  • $"und $,- seltsame Variablen für Listen- und Ausgabefeldtrennzeichen
  • $!- wie errnoals Zahl, aber strerror(errno)als Zeichenfolge
  • $_- die Stealth-Variable, immer verwendet und nie gesehen
  • $#_ - Indexnummer des letzten Unterprogrammarguments ... vielleicht
  • @_ - die (Nicht-) Namen der aktuellen Funktion ... vielleicht
  • $@ - die letzte Ausnahme
  • %:: - die Symboltabelle
  • $:, $^, $~, $-, Und $=- etwas mit Ausgabeformaten zu tun
  • $.und $%- Eingabezeilennummer, Ausgabeseitennummer
  • $/und $\- Trennzeichen für Eingabe- und Ausgabedatensätze
  • $| - Ausgangspufferregler
  • $[- Ändern Sie Ihre Array-Basis von 0-basiert auf 1-basiert auf 42-basiert: WHEEE!
  • $}- Seltsamerweise gar nichts!
  • $<, $>, $(, $)- reale und effektive UIDs und GIDs
  • @ISA - Namen der direkten Superklassen des aktuellen Pakets
  • $^T - Startzeit des Skripts in Sekunden
  • $^O - aktueller Name des Betriebssystems
  • $^V - Welche Version von Perl ist das?

Es gibt noch viel mehr, woher diese kamen. Lesen Sie die komplette Liste hier .


83
Die $[Variable ist die böseste von allen.
Brad Gilbert

24
Würde es auf jeden Fall begrüßen, wenn Perl 6 etwas wäre, das ich codieren könnte, ohne perldoc perlvaralle fünf Sekunden nachsehen zu müssen. (Obwohl ich gestehe, dass ich die Hälfte der Zeit, in der ich es überprüfe, denke: "Ich weiß, dass es eine spezielle Variable gibt, die dies für mich tun kann, ich erinnere mich nur nicht, welche ..." = P)
Chris Lutz

17
Das Problem dabei use English;ist, dass es die RegExp-Leistung beeinträchtigt. Ich mache das nicht nach. perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@ Dave: Dies ist aufgrund der Option -no_match_vars auf der von Ihnen verlinkten Seite kein Problem. @Brad: $ [ist so böse. Die Absicht dahinter ist böse, ja, aber es funktioniert auch nicht einmal! @Artem: from perlvar "Perl-Bezeichner, die mit Ziffern, Steuerzeichen oder Interpunktionszeichen beginnen, sind von den Auswirkungen der Paketdeklaration ausgenommen und müssen immer im Paket main sein. Sie sind auch von strengen 'vars'-Fehlern ausgenommen." Das bedeutet also, dass @ $ auch unter strengen Bedingungen fehlerfrei erstellt und zugewiesen wird. Pfui!
rjh

4
@Brian: Wie schlagen Sie vor, die Syntax zu lernen, wenn in der offiziellen Dokumentation selbst angegeben ist, dass der Perl-Interpreter unter bestimmten Umständen heuristisch errät, was eine Zeichenfolge bedeutet? Ist /$foo[bar]/der [bar]Teil beispielsweise eine Zeichenklasse oder ein Index des Arrays @foo? Grep perldata für die erschreckende Antwort.
j_random_hacker

289

PHPs Umgang mit numerischen Werten in Strings . In dieser vorherigen Antwort auf eine andere Frage finden Sie ausführliche Informationen, aber kurz gesagt:

"01a4" != "001a4"

Wenn Sie zwei Zeichenfolgen haben, die eine unterschiedliche Anzahl von Zeichen enthalten, können diese nicht als gleich angesehen werden. Die führenden Nullen sind wichtig, da dies Zeichenfolgen und keine Zahlen sind.

"01e4" == "001e4"

PHP mag keine Strings. Es sucht nach einer Entschuldigung, die es finden kann, um Ihre Werte als Zahlen zu behandeln. Ändern Sie die hexadezimalen Zeichen in diesen Zeichenfolgen geringfügig, und plötzlich entscheidet PHP, dass dies keine Zeichenfolgen mehr sind. Es handelt sich um Zahlen in wissenschaftlicher Notation (PHP kümmert sich nicht darum, dass Sie Anführungszeichen verwenden), und sie sind äquivalent, da führende Nullen für Zahlen ignoriert werden. Um diesen Punkt zu verstärken, werden Sie feststellen, dass PHP auch "01e4" == "10000"als wahr ausgewertet wird , da dies Zahlen mit äquivalenten Werten sind. Dies ist dokumentiertes Verhalten, es ist einfach nicht sehr sinnvoll.


56
Verwenden Sie einfach === und! ==. Welches sollte sowieso verwendet werden, es sei denn, ein loser Typvergleich ist erforderlich.
Dykam

14
@Dykam, wenn Sie dem Link zur ausführlicheren Antwort folgen, werden Sie feststellen, dass ich mich mit der Verwendung des Operators === befasst habe.
Dan Dyer

18
Wieder schwache Tippschläge!
Gillonba

43
Ich wusste immer, dass PHP eine Sünde ist. Bis jetzt wusste ich nicht, dass es eine unverzeihliche Sünde war: D
Thomas Eding

2
Sie sollten Techniker sein, die === in jedem Programmierbuch oder Tutorial verwenden. Hinweis hinzugefügt: In einer schlecht geschriebenen PHP-App konnte ich als Passwort alles angeben, was als dieselbe Nummer analysiert wurde.
Pepijn

282

Lassen Sie uns für alle Sprachen (wie PL / I) abstimmen, die versucht haben, reservierte Wörter zu beseitigen.

Wo sonst könnten Sie legal so amüsante Ausdrücke schreiben wie:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

( IF, THEN,ELSE Sind Variablennamen)

oder

IF IF THEN THEN ELSE ELSE

( IFist eine Variable THENund ELSEsind Unterprogramme)


1
@quark: das ist eine separate Antwort darauf! ;) ... (und ja, Sie können mit Englisch programmieren, stellen Sie es einfach als .ppt für andere Entwickler
Macke

28
@RoadieRich eine Gruppe von Büffeln ist nicht explizit von Buffalo, sie sind nur unscheinbare Büffel.
Jürgen A. Erhard

18
John, wo James gehabt hatte, hatte gehabt hatte, hatte eine bessere Wirkung auf den Lehrer gehabt.
GameFreak

4
Ich habe neulich einige Schildermacher vor einer Eisfabrik von Ben und Jerry gesehen. Ich kritisierte ihre Arbeit und sagte ihnen, dass zwischen Ben und und und und und Jerry nicht genug Platz sei.
Tom Gullen

9
Vielleicht wird es für zukünftige zeitliche Programme benötigt. WENN DANN = JETZT && WO = HIER DANN WANN = DANN ANDERES JETZT = ANDERWO
Kelly S. French

282

Die Funktion zur oktalen JavaScript-Konvertierung ist gut zu kennen:

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

Weitere Details hier .


60
Ich bin auf einen Fehler gestoßen, bei dem alle Zahlen außer 8 und 9 funktionierten !! War verrückt geworden !!! Danke Brian!
Faruz

10
@ Yada Meinst du nicht oktal? Hexadezimal ist 0x.
luiscubal

48
Und deshalb nimmt parseInt ein (optionales) zusätzliches Argument :).
LiraNuna

10
führende 0 bedeutet Oktalzahl. Da 8 keine gültige Oktalzahl ist, muss das Ergebnis 0 sein.
devio

22
... und parseInt ('010') -> 8, nur um Sie zu verwirren.
Richard Gadsden

213

Duffs Gerät in C!

In C kann man ein do / while mit einer switch-Anweisung verschachteln. Hier ein Beispiel für ein Memcpy mit dieser Methode:

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
Duffs Gerät ist wahrscheinlich ein guter Grund dafür, dass die switch-Anweisung standardmäßig keine Unterbrechung aufweist ;-) Ich habe jedoch noch keine andere gute Verwendung von Interlaced-Switch und -Schleife gesehen - aber wahrscheinlich gibt es eine. Oh, warte, ja, es gibt noch eine andere Verwendung: Coroutinen und Protothreads.
Frunsi

16
@frunsi: "Duffs Gerät ist wahrscheinlich ein guter Grund dafür, dass die switch-Anweisung standardmäßig keine Unterbrechung aufweist." - Machen Sie immer den allgemeinen Fall zum Standard. Ich würde nicht genau sagen, dass dies der häufigste Fall ist.
BlueRaja - Danny Pflughoeft

6
@mcv ist wahrscheinlich am einfachsten, wenn Sie versuchen, es als Assembler-Code zu lesen, dh das whileam Ende ist ein (bedingtes) JMPZurück zum do, was erklärt, warum Sie das überspringen können dound trotzdem in der Schleife landen.
WDS

14
Denken Sie daran, dass Duffs Gerät im Allgemeinen SCHLECHTEREN Code erzeugt als die normale Schleifenanweisung für moderne Compiler, die wissen, wie man (besser) das Abrollen von Schleifen durchführt, als Sie es von Hand tun können.
Billy ONeal

37
@frunsi: Duff selbst, der es veröffentlichte, behauptete ungefähr Folgendes: "Dies liefert definitiv ein Argument in der Diskussion, ob der Wechsel standardmäßig durchfallen sollte, aber ich bin nicht sicher, ob das Argument dafür oder dagegen ist."
SF.

204

Algol-Pass-by-Name (dargestellt mit C-Syntax):

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
Wenn Sie darüber nachdenken, macht es tatsächlich einen verdrehten Sinn
RCIX

90
Dies ist der ultimative "Pass by Reference".
Dykam

3
Es ist jedoch möglich in Scala ( def f(j : => int))
Dario

10
Das ist also so etwas wie ... 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
Es ist eigentlich ziemlich einfach: Sie generieren einen kleinen Code (normalerweise als "Thunk" bezeichnet, daher mein Wortspiel oben), der die Adresse berechnet, die sich aus dem Ausdruck ergibt, in diesem Fall & a [i]. Ein Zeiger auf diese Funktion wird an die aufgerufene Funktion übergeben, die dann bei jedem Zugriff auf den Parameter die aktuelle Adresse berechnet.
Richard Pennington

189

In Python:

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

Kein WTF, aber eine nützliche Funktion.


176
Ich wünschte, jede andere Sprache hätte diese Funktion
Vava

32
Wie bei so ziemlich jedem coolen Python-Feature sieht es so aus, als hätte Guido die Syntax eines coolen Lisp-Features nur ALGOLISIERT. :-)
Ken

4
Geoffrey, es ist ein Feature und (10 > 5 > 1) != ((10 > 5) > 1)in Python.
Sastanin

18
Außerdem wird es nur einmal ausgewertet, sodass (funct_a(5)+5 > b > funct_a(5))nur funct_a(5)einmal aufgerufen wird. Es ist eine großartige Funktion!
Khelben

57
@Khelben: Nein, funct_awird in diesem Beispiel zweimal aufgerufen. In wird b > funct_a(5) > ces aber nur einmal aufgerufen, im Gegensatz zu b > funct_a(5) and funct_a(5) > c.
Baffe Boyois

189

In Java:

int[] numbers() {
  return null;
}

Kann geschrieben werden als:

int numbers() [] {
  return null;
}

23
Beeindruckend! Ich wünschte, ich könnte eine Fliege an der Wand sein, als diese Array-Syntax entworfen wurde!
Adam Paynter

29
Ich hasse es, das zu sagen, aber das WTF ist eine konsequente Erweiterung des C-Typ-Systems. Wenn C-Funktionen Arrays zurückgeben könnten, würde dies so aussehen. Das Schönere ist eine Konsistenzverletzung, um es besser lesbar zu machen. Ähnlich wie "const char * var" vs "char const * var".
Gordon Wrigley

15
@Adam - Es ist tatsächlich sinnvoll, wenn man bedenkt, dass die Variablendeklaration in ähnlicher Weise sowohl "int stuff []" als auch "int [] stuff" zulässt. Sie lassen nur die gleichen Regeln für die Methodendeklaration gelten.
Brandon Yarbrough

2
@Imbus: Eigentlich const T*und T const*äquivalent, es ist das T* const, was den Zeiger konstituiert. Außerdem hasse ich ohne Schriftarten.
Simon Buchan

3
Immerhin numbers()[2]ist eine rechtliche Erklärung.
Badp

184

INTERCAL ist wahrscheinlich das beste Kompendium der seltsamsten Sprachfunktionen. Mein persönlicher Favorit ist das COMEFROM Aussage, die (fast) das Gegenteil von GOTO ist.

COMEFROM ist insofern das Gegenteil von GOTO, als es den Ausführungsstatus von einem beliebigen Punkt im Code in eine COMEFROM-Anweisung übernehmen kann. Der Punkt im Code, an dem die Statusübertragung stattfindet, wird normalerweise als Parameter an COMEFROM übergeben. Ob die Übertragung vor oder nach der Anweisung am angegebenen Übertragungspunkt erfolgt, hängt von der verwendeten Sprache ab. Abhängig von der verwendeten Sprache können mehrere COMEFROMs, die auf denselben Ausgangspunkt verweisen, ungültig sein, nicht deterministisch sein, in einer definierten Priorität ausgeführt werden oder sogar eine parallele oder anderweitig gleichzeitige Ausführung induzieren, wie in Threaded Intercal dargestellt. Ein einfaches Beispiel für eine "COMEFROM x" -Anweisung ist eine Bezeichnung x (die sich nicht physisch in der Nähe des entsprechenden COMEFROM befinden muss), die als "Falltür" fungiert. Wenn die Codeausführung das Label erreicht, wird die Steuerung an die Anweisung nach COMEFROM übergeben. Dies führt in erster Linie dazu, dass das Debuggen (und das Verstehen des Steuerungsflusses des Programms) äußerst schwierig wird, da in der Nähe des Etiketts kein Hinweis darauf angezeigt wird, dass die Steuerung auf mysteriöse Weise zu einem anderen Punkt des Programms springt.


16
Ziemlich böse - verwandelt Labels in GOTOs. Klingt wie ein Sprachfeature, um das Hacker bitten würden ...
RCIX

114
Ok, aber INTERCAL soll lustig sein - das ist kein wirklich überraschendes "Gotcha". Der INTERCAL-Compiler kann das Kompilieren des Programms tatsächlich ablehnen, wenn Sie den PLEASEModifikator nicht oft genug verwenden!
Groo

10
Klingt nach AOP :)
akuhn

6
Was mich am meisten überrascht, ist, dass bei der Systemanforderungsanalyse in der "World of Commercial TI" COMEFROMs tatsächlich in Textdateien verwendet werden, die Anwendungsfälle beschreiben. (Ernsthaft: Einige Analysten hier haben eine unternehmensweite Migration zu OpenOffice anstelle von MS's Office verzögert, da erstere ein "Comefrom" mit der erforderlichen Granularität in einem Link nicht richtig referenzieren konnten.)
jsbueno

5
Groo: Es ist schlimmer. Verwenden Sie PLEASE zu häufig und es weigert sich, Ihr Programm zu kompilieren, weil Sie groveln (C-INTERCAL erfordert zwischen 33% und 66% der Anweisungen, um PLEASE-Modifikatoren zu haben).
Vatine

160

Nicht wirklich eine Sprachfunktion, aber ein Implementierungsfehler: Einige frühe Fortran-Compiler implementierten Konstanten mithilfe eines konstanten Pools. Alle Parameter wurden als Referenz übergeben. Wenn Sie eine Funktion aufgerufen haben, z

f(1)

Der Compiler würde die Adresse der Konstante 1 im Konstantenpool an die Funktion übergeben. Wenn Sie dem Parameter in der Funktion einen Wert zugewiesen haben, würden Sie den Wert (in diesem Fall den Wert 1) global im Programm ändern. Verursachte einige Kopfkratzer.


124
Oh. Dann 2+2 kann gleich sein 5(für sehr große Werte 2natürlich!).
Alok Singhal

12
ähm, welcher Wert von 2 würde "2 + 2" == "5" ergeben? Ich weiß nicht, dass ein ganzzahliger Wert 2 annehmen kann, damit dies wahr ist.
Aaron

36
@earlz: Ich vermute, dass es sich um einen ganzzahligen Wert eines beliebigen Bitmusters handelt. Auf der anderen Seite könnten Sie wahrscheinlich 5 bis 4 auf diese Weise einstellen ( 2+2würde also 5für kleine Werte von gleich sein 5).
David Thornley

18
Entschuldigung, Alok, aber das ist der frühe FORTRAN, über den wir sprechen. Es wird nicht wahr sein, dass 2 + 2 = 5; Das ist ein Syntaxfehler. Was wahr sein wird, ist 2 + 2 .EQ. 5.
David Thornley

3
In Haskell
ergibt

153

Ich weiß nicht, ob es als Sprachfunktion angesehen werden kann, aber in C ++ liefert fast jeder Compilerfehler in Bezug auf Vorlagen täglich eine ganze Menge WTF an viele C ++ - Programmierer auf der ganzen Welt :)


15
Das ist in Ordnung, der meiste Code, der sich auf Vorlagen bezieht, erstellt bereits viele WTFs auf der ganzen Welt.
Joris Timmermans

43
Oh komm jetzt. undefinierter Verweis auf `std :: basic_ostream <char, std :: char_traits <char>> & std :: operator <<< std :: char_traits <char>> (std :: basic_ostream <char, std :: char_traits <char> > &, char const *) 'Ist perfekt lesbar!
Matt Greer

10
Ich hatte einmal einen vorlagenbezogenen Compilerfehler, der aus fünf Zeilen bestand, von denen die kürzeste siebzehntausend Zeichen umfasste (der klassische Fehler "Keine Übereinstimmung für x" in einem Programm mit tiefen Vorlagen). Das ist die WTF, nicht die Funktion überhaupt, Vorlagen sind wunderbar.
Andrew McGregor

111
Selbst wenn kein Fehler vorliegt, versuchen Sie mit Ihrem Profiler herauszufinden, welche Funktionen am längsten dauern. Oh schau, es iststd::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

12
Ich denke, das passt hier: Schauen Sie sich STLFilt unter bdsoft.com/tools/stlfilt.html an, um die Ausgabe lesbar zu machen.
Foraidt

150

Die vielen Namensräume von C:

typedef int i;

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

Oder mit Charakteren:

typedef char c;

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

Wie zum Teufel kompiliert das eindeutig?
Earlz

13
+1 Tag-IDs für Enums und Strukturen sind der verwirrendste Teil von C imho. Nur wenige Menschen verstehen, warum die Redewendung, einen Zeiger auf eine Struktur zu tippen, so aussieht, wie sie aussieht.
Tadeusz A. Kadłubowski

11
Es wird kompiliert, weil jedes dieser i's aufgrund des Kontexts einen eindeutigen Namespace hat.
Andrew McGregor

149

Ich würde sagen, das ganze Whitespace-Ding von Python ist mein größtes WTF-Feature. Zwar gewöhnt man sich nach einer Weile mehr oder weniger daran und moderne Redakteure machen es einfach, damit umzugehen, aber selbst nach der größtenteils Vollzeit-Python-Entwicklung im vergangenen Jahr bin ich immer noch davon überzeugt, dass es eine schlechte Idee war. Ich habe alle Gründe dafür gelesen, aber ehrlich gesagt beeinträchtigt dies meine Produktivität. Nicht viel, aber es ist immer noch ein Grat unter dem Sattel.

edit: Nach den Kommentaren zu urteilen, scheinen einige Leute zu denken, dass ich meinen Code nicht gerne einrücken möchte. Das ist eine falsche Einschätzung. Ich habe meinen Code immer eingerückt, egal in welcher Sprache und ob ich dazu gezwungen bin oder nicht. Was ich nicht mag, ist, dass es der Einzug ist, der definiert, in welchem ​​Block sich eine Codezeile befindet. Ich bevorzuge explizite Trennzeichen dafür. Unter anderem finde ich, dass explizite Trennzeichen das Ausschneiden und Einfügen von Code erleichtern.

Wenn ich beispielsweise einen Block mit 4 Leerzeichen eingerückt und am Ende eines Blocks mit 8 Leerzeichen eingerückt habe, hat mein Editor (alle Editoren?) Keine Ahnung, ob der eingefügte Code zum 8-Leerzeichen-Block oder zum äußeren gehört Block. OTOH, wenn ich explizite Trennzeichen habe, ist es offensichtlich, zu welchem ​​Block der Code gehört und wie er (neu) eingerückt werden sollte - dies geschieht durch intelligente Suche nach Blocktrennzeichen.

edit 2: Einige Leute, die Kommentare abgeben, scheinen zu glauben, dass dies eine Funktion ist, die ich hasse oder die Python meiner Meinung nach zu einer schlechten Sprache macht. Wieder nicht wahr. Ich mag es zwar nicht so sehr, aber das ist nebensächlich. Die Frage bezieht sich auf das seltsamste Sprachmerkmal, und ich finde das seltsam, da es sehr, sehr wenige (aber> 0) Sprachen verwenden.


63
Wenn es Ihrer Produktivität im Wege steht, kann Ihr Nicht-Python-Code nicht gut lesbar sein ...
Tor Valamo

27
Welche Sprache haben Sie vor Python verwendet? Wie konnten Sie mit anderen Menschen arbeiten und diese Sprache nicht einrücken? Wie könnte sich jemand mit nicht eingerücktem Code in irgendeiner Sprache abfinden? Haben Sie in einem Raum voller Genies gearbeitet, die keine visuellen Hinweise im Quellcode benötigten?
S.Lott

53
+1 Konnte nicht mehr zustimmen, wenn mein Editor (Emacs) meinen Code nicht automatisch basierend auf etwas Besonderem (wie geschweifte Klammern / Anfang, Ende / Sie nennen es) einrücken kann, ist es ernsthaft dumm. So ziemlich jedes Refactoring, das Sie für eine "größere" Funktion durchführen würden, kann eine wirklich schlechte Erfahrung sein.
Dmitry

83
Hier ist der Deal - mit jeder anderen Sprache kann ich einen Codeblock hervorheben und ihn von jedem Editor richtig einrücken lassen. Da Whitespace per Definition der richtige Einzug ist, verlieren Sie diese Fähigkeit in Python. Es ist also schwieriger, Code zu verschieben oder Dinge umzugestalten. Und für die Person, die behauptet, das OP sei die "erste Person, die behauptet, es sei ein Problem", musste ich eine Weile Python-Code pflegen, und aus diesem Grund werde ich jetzt jede Sprache über Python verwenden.
Kendall Helmstetter Gelner

38
Ich habe nichts gegen das Leerzeichen in Python. Die WTF ist, dass es nicht konsequent durchgesetzt wird. Sie können Einrückungsstufen und Registerkarten mischen, sofern sie mit ihren Geschwistern übereinstimmen. Die erste Einrückungsstufe kann also ein Leerzeichen sein, und die zweite kann zwei TABs sein, und dies ist kein Syntaxfehler.
dh

138

Ich hatte ein bisschen Probleme damit:

1;

In Perl müssen Module etwas Wahres zurückgeben .


29
Einige Module geben möglicherweise Werte zurück, die auf Laufzeitoperationen basieren. Wenn Sie immer true zurückgeben, müssen Sie immer noch nicht unkreativ sein: returnvalues.useperl.at
Anonymous

8
Wenn mein Perl-Speicher mir ordnungsgemäß dient, zeigt die Rückgabe von true von einem Modul an, dass das Modul erfolgreich geladen wurde. Die Rückgabe eines falschen Wertes bedeutete, dass ein Fehler aufgetreten war und das Programm nicht ausgeführt werden konnte (wenn es nicht abgefangen wurde).
Barry Brown

Dies ist ebenfalls eine gültige C-Anweisung, es wird nur nichts zurückgegeben.
Sigjuice

24
Mark Dominus schrieb: "Ich habe sehr selten verwendet, 'Cogito ergo sum';was bekanntlich in allen möglichen Universen selbstverständlich ist. Dies gewährleistet maximale Portabilität."
Greg Bacon

PHP <?=1;?>gibt 1 <?=true;?>zurück <?=false;?>. Gibt 1 zurück. Gibt null zurück.
Talvi Watia

135

Ich bin überrascht, dass niemand die 7- Schleifen-Konstrukte von Visual Basic erwähnt hat .

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

Weil ein! vor Ihrer Bedingung ist viel zu kompliziert!


47
Sie hätten es " Whileund Whend" schaffen sollen, da es einige Leute gibt, die das Wort "während" mit dem stimmlosen labialisierten Velar-Approximanten aussprechen. Und natürlich ist es besser in einer Reihe, und der Code, der in einer Reihe steht, ist schön.
Dreamlax

43
Warum benimmst du dich so komisch?
Erik Forbes

48
Beeindruckend. Ich werde ein bisschen nostalgisch, wenn ich darüber nachdenke. Das erste Mal, dass ich VB benutzte, war als 9-Jähriger zurück. Ich komme aus Schweden und konnte damals nicht sehr gut Englisch. Jetzt gibt es ein schwedisches Wort namens "vänd", was im Grunde "umkehren" bedeutet und das ähnlich wie "wend" ausgesprochen wird. Aus diesem Grund fand ich es sehr sinnvoll ... :)
Emil H.

61
! ist nicht in VB, es ist "nicht". Oder ist es? Ja, nicht ist nicht! Aber nicht.
Brian

7
Ja, "Wend" ist ein englisches Wort, das bedeutet, einen Kurs oder Weg zu gehen oder fortzufahren ( google.com/search?q=define%3A+wend ). Ich bin mir nicht sicher, ob das hilft oder weh tut.
Michael Myers

134

Für diejenigen, die nicht wissen, bc ist es eine "willkürliche Präzisionsrechnersprache", und ich benutze sie ziemlich oft für schnelle Berechnungen, insbesondere wenn die beteiligten Zahlen groß sind ( $ist die Eingabeaufforderung):

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

bcist seit langem ein Standard-Unix-Befehl .

Nun zur "WTF-Funktion". Das ist vonman bc (Schwerpunkt meiner):

Verlassen : Wenn die quit-Anweisung gelesen wird, wird der bc-Prozessor beendet, unabhängig davon, wo sich die quit-Anweisung befindet. Beispiel: "if (0 == 1) quit" führt dazu, dass bc beendet wird.

halt : Die halt-Anweisung (eine Erweiterung) ist eine ausgeführte Anweisung, die bewirkt, dass der bc-Prozessor nur beendet wird, wenn er ausgeführt wird. Beispiel: "if (0 == 1) halt" führt nicht dazu, dass bc beendet wird, da der Halt nicht ausgeführt wird.


41
Ich benutze Haskell für dieses Zeug.
Thomas Eding

8
Google Rechner?
igul222

7
Ich habe selbst angefangen, Python zu verwenden, und Google Calculator ist nett, wenn Sie online sind. Aber ich habe es früher verwendet bcund wollte bcwegen der tollen Zitate auf der Manpage in meinem Beitrag darüber schreiben .
Alok Singhal

6
@Brian, dann wird dir gefallen: echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(obwohl du das vielleicht schon weißt).
Alok Singhal

2
Ich benutze irb (Ruby Interactive Shell). Aber früher habe ich immer nach DC gegriffen - wie BC, aber mit umgekehrter Politur. Geektastisch!
Tragomaskhalos

134

Ich habe mich immer gefragt, warum das einfachste Programm ist:

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

Während es sein könnte:

print "Hello World!"

Vielleicht, um Informatikstudenten überhaupt zu erschrecken ...


34
In einigen Sprachen "Hallo Welt!" ist ein gültiges Programm.
David Thornley

31
@SoMoS: In den meisten dynamischen Sprachen wie Python, Ruby oder Perl wird "Hello World!" oder eine geringfügige Abweichung (z. B. Puts anstelle von Druck) ist ein gültiges und vollständiges Programm.
Dave Kirby

36
@ Loadmaster: Die Implikation war, dass "der gesamte Code in eine Klasse gehört" oder "der gesamte Code in eine Funktion gehört" unnötige Einschränkungen sind
Jimmy

19
Nur weil eine Sprache die Verwendung von Objekten erzwingt, bedeutet dies nicht, dass sie für eine ordnungsgemäße objektorientierte Programmierung verwendet wird. Es ist durchaus möglich, prozedural in Java oder C # zu programmieren. Dafür sind statische Methoden da.
jdmichal

68
Ich liebe Menschen, die denken, OOP bedeutet, dass alles ein Objekt sein sollte.
Tor Valamo

132

JavaScript ist objektorientiert, oder? Daher sollten Ausführungsmethoden für Literalzeichenfolgen und -zahlen funktionieren. Wie "hello".toUpperCase()und 3.toString(). Es stellt sich heraus, dass der zweite ein Syntaxfehler ist. Warum? Weil der Parser erwartet, dass eine Zahl gefolgt von einem Punkt ein Gleitkomma-Literal ist. Das ist nicht die WTF, die WTF ist, dass Sie nur einen weiteren Punkt hinzufügen müssen, damit es funktioniert:

3..toString()

Der Grund ist, dass das Literal 3.als interpretiert 3.0wird und gut 3.0.toString()funktioniert.


8
Funktioniert auch in Python so (versuchen 3..__add__(4)). (3).__add__(4)
Andererseits

49
Sie können einfach (3) .toString ()
Joseph Montanez

13
@ Gorilla3D: Ja, aber das ist keine seltsame Sprachfunktion, oder?
Theo

25
3.0.toString()macht meine Augen jucken.
Ben Blank

18
127.0.0.1.toInt ()
Berkus

130

In JavaScript:

2 == [2]

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

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

Zum Glück haben mir die freundlichen Leute von stackoverflow.com das Ganze erklärt: Warum ist 2 == [2] in JavaScript?


6
Deshalb sollten Sie ===stattdessen verwenden.
Gumbo

10
Dies ist übrigens nützlich. Wenn Sie eine Funktion haben, die eine Nummer zurückgibt und einige zusätzliche Metadaten damit zurückgeben möchten, können Sie [number] mit einigen zusätzlichen Feldern zurückgeben. Einfacher Code wird nie erfahren, dass es sich nicht um eine reelle Zahl handelt, und anderer Code kann die erforderlichen Metadaten abrufen.
Andrey Shchekin

36
@Andrey, außer dass ich, wenn ich jemals Code pflegen muss, der das tut, was Sie vorschlagen, dem Autor sehr bald den Tod wünschen würde.
Breton

@ Andrew, das ist eine großartige Idee! Sie können auch Number(n)etwas Ähnliches tun. Leider in beiden unserer Lösungen ===Pausen = (.
Xavi

5
+1: Ich habe mich als einen sachkundigen js-Programmierer betrachtet, und ich habe nie davon gewusst: D
Thomas Eding

126

Meine am meisten gehasste Funktion ist die Syntax einer Konfigurationsdatei, die bedingte Logik enthält. Diese Art von Dingen ist in der Java-Welt weit verbreitet (Ant, Maven usw. Sie wissen, wer Sie sind!).

Am Ende programmieren Sie nur in der Sprache ac ** p, mit eingeschränktem Debugging und eingeschränkter Editorunterstützung.

Wenn Sie in Ihrer Konfiguration Logik benötigen, ist der "Pythonic" -Ansatz zum Codieren der Konfiguration in einer realen Sprache viel besser.


24
Tcl hat das lange vor Pythons Geburt neu erfunden und Lisp hat es vorher erfunden. Nennen wir es also nicht Pythonic, sondern Emacs-ish.
Slebetman

46
Nennen wir es einfach richtig.
mletterle

30
AMEN. Wenn Ihre Konfiguration oder Build-Sprache vollständig ist, machen Sie es falsch. Ich sehe dich an CMake / Autotools.
Joseph Garvin

16
Genau dafür wurde Lua ursprünglich entwickelt
Cogwheel

1
Wenn sich Ihr Code in Python befindet, ist es eine gute Idee, Ihre Konfigurationsdatei als Python-Datei zu verwenden, da Sie dann einfach die Datei importieren und die Attribute des Moduls lesen. Und Sie erhalten die 100% Turing Complete-Leistung von Python in Ihrer Konfigurationsdatei.
Asmeurer

113

powerbasic (www.powerbasic.com) enthält die Compiler-Direktive:

# BLOAT {bloatsize}

Dies erhöht die Größe der kompilierten ausführbaren Datei um <bloatsize>Bytes. Dies wurde in den Compiler gestellt, falls Personen, die die ausführbare Datei erstellen, die geringe Größe der generierten ausführbaren Datei nicht mögen. es lässt die EXE größer erscheinen, um mit aufgeblähten Programmiersprachen zu konkurrieren :)


9
Haha yuk. Ich habe gehört, dass Entwickler einige Vorgänge absichtlich verlangsamen (z. B. eine Suche), weil sie den Leuten helfen, zu glauben, dass sie wirklich etwas tun. Ähnliches denke ich.
David

42
Das erinnert mich an etwas, das ich kürzlich gelesen habe. Sie testeten einen FPS und beschlossen, die Anzahl der Trefferpunkte der Bösen zu erhöhen. Dann fragten sie die Tester, wie es ihrer KI gehe, und sie schworen, dass es viel schlauer sei. Aber die KI hatte sich nicht verändert, nur die Trefferpunkte. Die Menschen haben eine bestimmte Erzählung über die Welt im Kopf, und wenn Sie ihre Erwartungen verstehen und ihnen entsprechen, gehen sie einfach davon aus, dass dies ihre Erzählung bestätigt.
Nate CK

5
Früher habe ich meinen Programmen eine zusätzliche Verlangsamung hinzugefügt, damit sie so aussehen, als würden sie etwas Kompliziertes tun. Zurück in der Grundschule.
Matti Virkkunen

3
In der Schule hatten wir 80286 Maschinen und ich musste tatsächlich einige Bildschirmausgaberoutinen in der Montage schreiben, um eine angemessene Geschwindigkeit zu erreichen (dh nicht zu kriechen).
Berkus

7
@Nate CK, wenn die KI lange genug leben seine KI zu zeigen, es kann tatsächlich sein , smarter, während , bevor es zu schnell , es zu beweisen gestorben sein.
zzzzBov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.