คุณสมบัติภาษาที่แปลกประหลาด


974

ในความเห็นของคุณฟีเจอร์ภาษาที่แปลกประหลาดแปลกหรือแปลกจริง ๆ ที่คุณพบคืออะไร?

กรุณาเพียงหนึ่งคุณสมบัติต่อคำตอบ


5
@ gablin ฉันคิดว่าถ้าคุณรวมตัวคั่น LISP กับ PERL regex โดยใช้ javascript parsing คุณจะครอบคลุม 90% ของ WTF ...
Talvi Watia

คำตอบ:


1859

ใน C อาร์เรย์สามารถจัดทำดัชนีดังนี้:

a[10]

ซึ่งเป็นเรื่องธรรมดามาก

อย่างไรก็ตามรูปแบบที่รู้จักน้อยกว่า (ซึ่งใช้งานได้จริง!) คือ:

10[a]

ซึ่งหมายถึงเช่นเดียวกับข้างต้น


758
นั่นเป็นเพราะ [10] หมายถึง * (a + 10) ... และ 10 [a] หมายถึง * (10 + a) :)
Michel Gokan

77
อย่าลืม "Hello World" [i] หรือฉัน ["Hello World"]
Richard Pennington

167
หรือเป็นประโยชน์เพิ่มเติม "0123456789abcdef" [x & 0xf]
Dipstick

17
@frunsi: มันมักจะทำงานตามที่คาดไว้ การเพิ่มตัวชี้ไม่เหมือนกับการเพิ่มจำนวนเต็มแบบง่าย ๆ กับที่อยู่ มันเป็นการสับเปลี่ยนไม่ว่าขนาดจะเป็นประเภทใดในคำถาม
R. Martinho Fernandes

12
@mcv - a [10] เหมือนกับ "* (a + 10)" โดยที่นิพจน์ "a + 10" เป็นตัวคำนวณทางคณิตศาสตร์ (และเนื่องจาก a เป็นตัวย่อในตัวอย่างของคุณเครื่องหมาย +10 หมายถึง 'เริ่มต้นที่ ที่อยู่ของ a และย้าย 10 กางเกงขาสั้นเช่น 20 ไบต์ ') การแสดงออกที่ 10 [เป็น] เป็น interepreted เป็น "* (10 + A)" ซึ่ง "10 + A" เป็นยังเลขคณิตชี้และได้รับการปฏิบัติแบบเดียวกัน
Edan Maor

1292

ใน JavaScript:

 '5' + 3 gives '53'

แต่ทว่า

 '5' - 3 gives 2

81
ฉันจำได้เมื่อฉันเริ่มใช้จาวาสคริปต์โดยใช้เทคนิคประเภทนี้เพื่อเพิ่มตัวเลขในสตริง: "111" - - "222" ให้ 333 ขณะที่ "111" + "222" ให้ "111222"
Callum Rogers

112
+สำหรับการต่อสตริงเป็นสิ่งที่น่ากลัว
Matteo Riva

416
+ สำหรับการต่อข้อมูลไม่ใช่ปัญหา การพิมพ์ที่อ่อนแอคือ
FogleBird

270
@FogleBird ไม่มีปัญหาตัวใดตัวหนึ่งจริงๆ มันเป็นเพียงการรวมกันของทั้งสองกับกฎการบังคับที่ไม่สอดคล้องกัน
TM

70
ดังนั้นโดยทั่วไปแล้ว + ถือว่ามีความเกี่ยวข้องเมื่อสตริงเข้ามาเกี่ยวข้อง ทำไมพวกเขาไม่สามารถเขียนโค้ดบางอย่างเช่น '123456' - 456 = '123' นั่นจะน่าสนใจ
Jimmie Lin

872

ใน JavaScript โครงสร้างต่อไปนี้

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

ผลตอบแทนที่undefinedreturnเป็นข้อผิดพลาดทางไวยากรณ์เนื่องจากการแทรกอัฒภาคนัยส่อเสียดบนบรรทัดใหม่หลังจาก งานต่อไปนี้ตามที่คุณคาดหวัง:

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

ยิ่งแย่ไปกว่านี้มันใช้งานได้ดี (ใน Chrome อย่างน้อย):

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

นี่คือตัวแปรของปัญหาเดียวกันที่ไม่ได้เกิดข้อผิดพลาดทางไวยากรณ์ แต่ล้มเหลวอย่างเงียบ ๆ :

return
    2 + 2;

225
การแทรกเครื่องหมายอัฒภาคเป็นส่วนที่ชั่วร้ายที่สุดของ JavaScript

230
คุณมักประสบปัญหาเมื่อคุณออกแบบคุณสมบัติภาษาโดยตั้งสมมติฐานว่าผู้ใช้ของคุณส่วนใหญ่จะเป็นคนงี่เง่า
Rob Van Dam

8
ฉันมีปัญหานั้นจริง ๆ แล้วในฐานะที่เป็นนักพัฒนา c # ฉันเองได้ใส่เครื่องหมายวงเล็บในบรรทัดใหม่ ใช้เวลาหลายชั่วโมงในการตระหนักว่าปัญหาคืออะไร แม้ว่าฉันจะแก้ไขปัญหาแล้วฉันก็ยังไม่รู้ว่าปัญหาคืออะไรจนกว่าฉันจะอ่านคำตอบของคุณ!
Fedor Hajdu

24
Nick Retallack: เนื่องจากเนื่องจากวงเล็บปีกกาแบบ C-like ของ JavaScript และไวยากรณ์เครื่องหมายอัฒภาคจึงไม่ปรากฏเลยว่าการขึ้นบรรทัดใหม่มีความสำคัญ
Tamas Czinege

19
หากคุณไม่ควรใช้สไตล์ C เมื่อโปรแกรมใน JavaScript แสดงว่ามันค่อนข้างผิดเพี้ยนจากนักออกแบบภาษา 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
ดังนั้นวัตถุประสงค์อะไร==ในสายตาของนักออกแบบภาษา?
Chris S

137
ผู้คนสับสน
Javier

123
มันต้องการจะดีถ้า==มีความหมายของ===และแล้วก็มีผู้ประกอบการอีกบางอย่างเช่น~=ว่าประเภทการข่มขู่ได้รับอนุญาต
TM

18
@Otto จริงแล้วเนื่องจากเราดูตัวอย่างของเขาแสดงว่า == ไม่สมมาตร ในขณะนี้ฉันไม่เห็นว่าการแลกเปลี่ยน commutativity จะถูกระบุสำหรับความสัมพันธ์แบบไบนารี
PeterAllenWebb

660

Trigraphs ใน C และ C ++

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

นี้จะพิมพ์LOL|เพราะ trigraph จะถูกแปลงเป็น??!|


71
ด่วน! บอก C / b / โปรแกรมเมอร์ทั้งหมด!
Esteban Küber

235
Trigraphs นั้นน่าทึ่งเพราะคุณมั่นใจได้เลยว่าไม่มีใครจะรู้ว่าอะไร! จะหมายถึงจาก Google โดยที่ไม่รู้ชื่อแล้ว
zaratustra

56
Trigraphs ถูกปิดใช้งานโดยค่าเริ่มต้นใน GCC
sastanin

360
สิ่งเหล่านี้ช่วยให้คุณใช้ "ผู้ดำเนินการ WTF": (foo ()! = ERROR) ??! ??! cerr << "เกิดข้อผิดพลาด" << endl;
user168715

57
Trigraphs เป็นสิ่งชั่วร้ายที่จำเป็นเมื่อพวกเขาได้รับการแนะนำ บางแพลตฟอร์มไม่รวมอักขระที่สำคัญในภาษาดังนั้นจึงเป็น "ตรีโกณมิติ" หรือ "คุณไม่สามารถมี C คอมไพเลอร์ในตอนท้ายของคำสั่งคอมไพเลอร์เพื่อไปใช้แอสเซมเบลอร์" ลองดูคำอธิบายของ Stroustrup ใน "ภาษาการเขียนโปรแกรม C ++"
Euro Micelli

573

สนุกกับ auto Boxing และแคชจำนวนเต็มใน 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เว้นแต่จะมีการตั้งค่าโดยคุณสมบัติ

สิ่งที่เกิดขึ้นกับ auto Boxing คือทั้ง foo และ bar วัตถุจำนวนเต็มเดียวกันที่ดึงมาจากแคชเว้นแต่จะสร้างอย่างชัดเจน: เช่นfoo = new Integer(42)เมื่อเปรียบเทียบความเท่าเทียมกันของการอ้างอิงพวกเขาจะเป็นจริงมากกว่าเท็จ วิธีที่เหมาะสมในการเปรียบเทียบค่าจำนวนเต็มคือการใช้.equals;


31
เอาฉันสองสามวินาทีเพื่อดูว่าทำไม ... java ต้องเก็บกลุ่มอินสแตนซ์ของ Integer สำหรับค่าระหว่าง -128 และ 128 มิฉะนั้นจะกำหนดให้ Integer ใหม่ใช่มั้ย
Mike Akers

18
อย่างไรก็ตามโปรดทราบว่าหากคุณระบุจำนวนเต็มใหม่ (42) จะไม่ใช้อินสแตนซ์จากกลุ่มดังนั้น foo == แถบจะประเมินเป็น false
z -

10
ฉันมักจะใช้ ints แทนจำนวนเต็มถ้าเป็นไปได้ แต่ถ้าฉันต้องใช้จำนวนเต็มด้วยเหตุผลบางอย่างฉันควรใช้. Equals () แทนที่จะเป็น ==?
MatrixFrog

246
ดีใจมากที่ฉันเป็นโปรแกรมเมอร์ C #

87
@ Will: C # มี gotchas ที่คล้ายกันมาก ดู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
ริชาร์ด Ev

64
ผลตอบแทนนี้เป็นเท็จหรือไม่ มันอาจดูเหมือน WTF (และอาจเป็นหนึ่งเดียว) แต่ฉันใช้ชีวิตตามกฎ: ในที่สุดก็ชนะเสมอเว้นแต่คุณจะผิดพลาดของเครื่องก่อน
Michael Stum

28
เพื่อความยุติธรรมฉันตำหนิคำอธิบายที่ดีของ TDWTF สำหรับการจดจำว่าในที่สุดก็ชนะเสมอเว้นแต่คุณจะดึงสายไฟ: thedailywtf.com/Articles/My-Tales.aspx
Michael Stum

22
ฉันไม่แน่ใจว่ารหัสควรกลับมาในกรณีนี้ แต่ฉันมั่นใจอย่างแน่นอนว่าคุณต้องไม่อยู่returnในfinallyประโยค
jfs

325

APL (นอกเหนือจากทั้งหมด)ความสามารถในการเขียนโปรแกรมใด ๆ ในหนึ่งบรรทัด

เช่นเกมแห่งชีวิตของ Conway ในหนึ่งบรรทัดใน APL :

alt text http://catpad.net/michael/APLLife.gif

ถ้าบรรทัดนั้นไม่ใช่ WTF แสดงว่าไม่มีอะไร!

และนี่คือวิดีโอ


19
ฉันรัก APL อาความสุขของการใช้จ่ายตลอดทั้งบ่ายเพื่อเขียนโค้ดครึ่งบรรทัด! สิ่งแรกที่ฉันจะทำเมื่อฉันได้รับแป้นพิมพ์ที่ฉันสามารถเขียนโปรแกรมแสดงตัวอักษรคือการยืนยันตัวเองด้วย APL อีกครั้ง
Daniel C. Sobral

24
ดูเหมือนภาษาสำหรับชาวกรีก
Esko

45
@Erik: มีความสุขที่พบได้ในการเขียนโค้ดซึ่งเกี่ยวกับสิ่งที่คุณต้องการเพียงอย่างเดียวไม่ใช่เกี่ยวกับการไปถึงที่นั่น การแสดงรหัสของคุณเป็นนิพจน์เดียว มันเหมือนคัตทานาที่สมบูรณ์แบบที่สุด แน่นอนว่าในการต่อสู้จริงฉันควรมีปืน
Daniel C. Sobral

7
@Daniel: คุณใช้เวลาทั้งบ่ายเพื่อเขียนบรรทัดของรหัส ... และตลอดทั้งสัปดาห์เพื่ออ่านโค้ด ;-)
Jürgen A. Erhard

93
APL น่าจะได้เห็นในหนังแอ็คชั่นไซไฟ ฉันนึกภาพใครบางคนกำลังนั่งอยู่ที่สถานีสามสีพึมพำ "เปลี่ยนรูปร่างของเวกเตอร์ขีปนาวุธข้าศึก ... ไขว่คว้า ... pi คูณลอการิทึม ตามด้วยการระเบิดและเชียร์
Joey Adams

321

เทมเพลต C ++ ที่แปลกสามารถนำมาใช้เพื่อแสดงให้เห็นได้ดีที่สุดโดย"Multi-Dimensional Analog Literals"ซึ่งใช้เทมเพลตเพื่อคำนวณพื้นที่ของรูปร่าง "วาด" รหัสต่อไปนี้คือ C ++ ที่ถูกต้องสำหรับสี่เหลี่ยมผืนผ้า 3x3

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

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

หรืออีกตัวอย่างหนึ่งที่มีลูกบาศก์ 3 มิติ:

  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
ช่างเป็นอะไรที่ทำให้ฉันตื่นขึ้นมาอีกครั้งเมื่อมี AnalogLiterals รุ่นหนึ่งที่รองรับการหมุนตัวอักษรรอบแกน X, Y และ Z ใน Eclipse ... ตอนนี้ที่จะให้ความหมายที่แท้จริง "visual programming"
TheBlastOne

2
การเรียงลำดับของ o และ L และของ |
Ming-Tang

4
เรื่องการสั่งซื้อเนื่องจากเทมเพลตใช้ประโยชน์จากการโอเวอร์โหลดของผู้ประกอบการอย่างสร้างสรรค์ (อย่าทำสิ่งนี้ด้วยรหัสจริงการใช้ตัวดำเนินการที่ผิดทำให้โค้ดอ่านยาก)
josefx

292

Perl ตัวแปรในตัวจำนวนมาก:

  • $#- ไม่แสดงความคิดเห็น!
  • $0, $$และ$?- เช่นเดียวกับตัวแปรเชลล์ด้วยชื่อเดียวกัน
  • , $&และ$'- ตัวแปรจับคู่แปลก
  • $"และ$,- ตัวแปรแปลก ๆ สำหรับ list- และ output-field-separators
  • $!- ชอบerrnoเป็นตัวเลข แต่strerror(errno)เป็นสตริง
  • $_- ตัวแปรการลักลอบใช้อยู่เสมอและไม่เคยเห็น
  • $#_ - หมายเลขดัชนีของอาร์กิวเมนต์รูทีนย่อยสุดท้าย ... อาจจะ
  • @_ - ชื่อ (ไม่ใช่) ของฟังก์ชันปัจจุบัน ... อาจจะ
  • $@ - ข้อยกเว้นยกล่าสุด
  • %:: - ตารางสัญลักษณ์
  • $:, $^, $~, $-และ$=- บางสิ่งบางอย่างจะทำอย่างไรกับรูปแบบการออก
  • $.และ$%- หมายเลขบรรทัดอินพุตหมายเลขหน้าเอาต์พุต
  • $/และ$\- ตัวแยกเร็กคอร์ดอินพุตและเอาต์พุต
  • $| - คอนโทรลเลอร์บัฟเฟอร์เอาต์พุต
  • $[- เปลี่ยนอาเรย์ฐานของคุณจาก 0 เป็น 1-based เป็น 42-based: WHEEE!
  • $}- ไม่มีอะไรแปลกประหลาดพอ!
  • $<, $>, $(, $)- UIDs จริงและมีประสิทธิภาพและ GIDs
  • @ISA - ชื่อของซูเปอร์คลาสโดยตรงของแพ็คเกจปัจจุบัน
  • $^T - เวลาเริ่มต้นสคริปต์ในไม่กี่วินาที
  • $^O - ชื่อระบบปฏิบัติการปัจจุบัน
  • $^V - Perl รุ่นนี้คืออะไร

ยังมีอีกมากที่มาจาก อ่านรายชื่อทั้งหมดที่นี่


83
$[ตัวแปรคือความชั่วร้ายที่สุดของพวกเขาทั้งหมด
Brad Gilbert

24
จะขอบคุณมันแน่นอนถ้า Perl 6 เป็นสิ่งที่ฉันสามารถเขียนโค้ดโดยไม่ต้องตรวจสอบperldoc perlvarทุกห้าวินาที (แม้ว่าฉันจะยอมรับว่าครึ่งเวลาที่ฉันตรวจสอบความคิดว่า "ฉันรู้ว่ามีตัวแปรพิเศษที่สามารถทำสิ่งนี้ให้ฉันได้ แต่ฉันจำไม่ได้ว่าอันไหน ... " = P)
Chris Lutz

17
ปัญหาuse English;คือมันส่งผลกระทบต่อประสิทธิภาพของ RegExp ฉันไม่ได้ทำขึ้น perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@Dave: ไม่ใช่ปัญหาเนื่องจากตัวเลือก -no_match_vars ในหน้าเว็บที่คุณเชื่อมโยง @Brad: $ [เป็นสิ่งที่เลวร้ายมาก ความตั้งใจที่อยู่เบื้องหลังมันคือความชั่วร้ายใช่ แต่มันก็ไม่ได้ผล! @Artem: จาก perlvar "ตัวระบุ Perl ที่เริ่มต้นด้วยตัวเลข, อักขระควบคุมหรืออักขระเครื่องหมายวรรคตอนได้รับการยกเว้นจากผลกระทบของการประกาศแพ็กเกจและถูกบังคับให้อยู่ในแพ็คเกจหลักเสมอพวกเขายังได้รับการยกเว้นจากข้อผิดพลาด ดังนั้นนั่นหมายความว่า @ $ จะถูกสร้างและกำหนดให้โดยไม่มีข้อผิดพลาดแม้จะอยู่ภายใต้การควบคุมที่เข้มงวด ฮึ
rjh

4
@Brian: คุณจะเสนอวิธีการเรียนรู้ไวยากรณ์ได้อย่างไรเมื่อเอกสารอย่างเป็นทางการระบุว่ามีสถานการณ์ที่ล่ามภาษา Perl ซึ่งคาดเดาได้ยากว่าลำดับของตัวอักษรหมายถึงอะไร เช่นในการ/$foo[bar]/เป็น[bar]ส่วนหนึ่งของตัวละครคลาสหรือห้อยไปยังอาร์เรย์ที่@foo? Grep perldata สำหรับคำตอบที่น่ากลัว
j_random_hacker

289

จัดการ PHP ของค่าตัวเลขในสตริง ดูคำตอบก่อนหน้านี้สำหรับคำถามอื่นสำหรับรายละเอียดทั้งหมด แต่โดยย่อ:

"01a4" != "001a4"

หากคุณมีสองสายที่มีจำนวนอักขระที่แตกต่างกันพวกเขาจะถือว่าไม่เท่าเทียมกัน ศูนย์นำหน้ามีความสำคัญเนื่องจากสิ่งเหล่านี้ไม่ใช่สตริง

"01e4" == "001e4"

PHP ไม่ชอบสตริง มันกำลังมองหาข้อแก้ตัวใด ๆ ที่สามารถพบได้ในการรักษาค่าของคุณเป็นตัวเลข เปลี่ยนอักขระเลขฐานสิบหกในสตริงเหล่านั้นเล็กน้อยและทันใดนั้น PHP ตัดสินใจว่าสิ่งเหล่านี้ไม่ใช่สตริงอีกต่อไปพวกเขาเป็นตัวเลขในรูปแบบทางวิทยาศาสตร์ (PHP ไม่สนใจว่าคุณใช้เครื่องหมายคำพูด) และพวกเขาเทียบเท่ากันเพราะศูนย์นำหน้า เพื่อเสริมจุดนี้คุณจะพบว่า PHP ยังประเมิน"01e4" == "10000"ว่าเป็นจริงเพราะตัวเลขเหล่านี้มีค่าเทียบเท่า นี่เป็นพฤติกรรมที่บันทึกไว้มันไม่สมเหตุสมผลนัก


56
เพียงใช้ === และ! == ซึ่งควรจะใช้ต่อไปเว้นแต่จะต้องการการเปรียบเทียบชนิดหลวม
Dykam

14
@Dykam หากคุณไปที่ลิงก์ไปยังคำตอบที่สมบูรณ์กว่านี้คุณจะเห็นว่าฉันได้ใช้งานตัวดำเนินการ ===
Dan Dyer

18
พิมพ์อ่อนแออ่อนแออีกครั้ง!
gillonba

43
ฉันรู้เสมอว่า PHP เป็นบาป จนถึงตอนนี้ฉันไม่ได้ตระหนักว่ามันเป็นบาปที่ไม่อาจยกโทษให้ได้: D
Thomas Eding

2
พวกเขาควรใช้เทคโนโลยีคน === ในการเขียนโปรแกรมหนังสือหรือกวดวิชา เพิ่มหมายเหตุ: ในแอป PHP ที่เขียนไม่ดีฉันสามารถระบุรหัสผ่านของฉันทุกอย่างที่มีการแยกวิเคราะห์เป็นหมายเลขเดียวกัน
Pepijn

282

มาโหวตกันทุกภาษา (เช่น PL / I) ที่พยายามกำจัดคำที่สงวนไว้

คุณสามารถเขียนสำนวนที่น่าขบขันเช่นที่อื่นได้ที่ไหน:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

( IF, THEN, ELSEเป็นชื่อตัวแปร)

หรือ

IF IF THEN THEN ELSE ELSE

( IFเป็นตัวแปรTHENและELSEเป็นรูทีนย่อย)


1
@quark: นั่นเป็นคำตอบแยกต่างหากสำหรับเรื่องนี้! ;) ... (และใช่คุณสามารถเขียนโปรแกรมด้วยภาษาอังกฤษเพียงปรับใช้เป็น. ppt กับผู้พัฒนารายอื่น)
Macke

28
@RoadieRich ควายกลุ่มหนึ่งไม่ได้ระบุอย่างชัดเจนจากควายพวกมันเป็นแค่กระบืออึมครึม
Jürgen A. Erhard

18
จอห์นที่เจมส์เคยมีมาก่อนมีผลดีกว่าครู
GameFreak

4
ฉันเห็นผู้ผลิตป้ายนอกเบ็นและโรงงานผลิตไอศกรีม jerrys เมื่อวันก่อน ฉันวิจารณ์การทำงานของพวกเขาฉันบอกพวกเขาว่ามีที่ว่างไม่พอระหว่างเบ็นและกับและกับเจอร์รี่
Tom Gullen

9
อาจจำเป็นสำหรับโปรแกรมชั่วคราวในอนาคต หากจากนั้น = ตอนนี้ && WHERE = ที่นี่จากนั้น = อีกแล้ว = ELSEWHERE
Kelly S. French

282

คุณลักษณะ 'การแปลงเลขฐานแปด JavaScript' เป็นสิ่งที่ดีที่ควรทราบ:

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

รายละเอียดเพิ่มเติมที่นี่


60
ติดอยู่กับบั๊กที่ตัวเลขทั้งหมดทำงานได้ยกเว้น 8 และ 9 !! กำลังจะบ้า !!! ขอบคุณไบรอัน!
Faruz

10
@Yada คุณไม่ได้หมายถึงเลขฐานแปดใช่ไหม เลขฐานสิบหกคือ 0x
luiscubal

48
และนั่นคือเหตุผลที่การแยกวิเคราะห์ใช้อาร์กิวเมนต์พิเศษ (เป็นทางเลือก) :)
LiraNuna

10
ชั้นนำ 0 หมายถึงจำนวนฐานแปด เนื่องจาก 8 ไม่ใช่เลขฐานแปดที่ถูกต้องผลลัพธ์จะต้องเป็น 0
devio

22
... และ parseInt ('010') -> 8 เพียงเพื่อสร้างความสับสนให้คุณ
Richard Gadsden

213

อุปกรณ์ของ Duff ใน C!

ใน C หนึ่งสามารถทำงานร่วมกันทำ / ขณะที่มีคำสั่งเปลี่ยน นี่คือตัวอย่างของ 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
อุปกรณ์ของดัฟฟ์น่าจะเป็นเหตุผลที่ดีสำหรับคำสั่งสวิทช์ที่ไม่มีการหยุดพักโดยค่าเริ่มต้น ;-) อย่างไรก็ตามฉันยังไม่เห็นการใช้ interlaced สวิตช์และลูปอื่น ๆ ที่ดี แต่อาจมี โอ้เดี๋ยวก่อนใช่มีประโยชน์อีกอย่างหนึ่งคือ coroutines และ protothreads
Frunsi

16
@frunsi: "อุปกรณ์ของดัฟฟ์น่าจะเป็นเหตุผลที่ดีสำหรับคำสั่งสวิทช์ที่ไม่มีการหยุดพักโดยค่าเริ่มต้น" - ทำให้ตัวพิมพ์ใหญ่เป็นค่าเริ่มต้นเสมอ ฉันจะไม่บอกว่านี่เป็นกรณีทั่วไป ..
BlueRaja - Danny Pflughoeft

6
@mcv อาจจะง่ายที่สุดถ้าคุณพยายามอ่านมันเป็นรหัสแอสเซมบลีนั่นคือwhileในตอนท้ายคือ (เงื่อนไข) JMPกลับไปที่doซึ่งอธิบายว่าทำไมคุณสามารถข้ามdoและยังคงอยู่ในวง
wds

14
พึงระลึกไว้เสมอว่าอุปกรณ์ของดัฟฟ์สร้างรหัส WORSE มากกว่าคำสั่งวนลูปปกติสำหรับคอมไพเลอร์สมัยใหม่ซึ่งรู้วิธีการวนลูปที่ดีกว่าที่คุณสามารถทำได้ด้วยมือ
Billy ONeal

37
@frunsi: ดัฟฟ์ตัวเองเผยแพร่มันอ้างว่าอะไรเช่นนี้: "นี่เป็นข้อโต้แย้งในการอภิปรายว่าสวิตช์ควรผ่านโดยค่าเริ่มต้น แต่ฉันไม่แน่ใจว่าอาร์กิวเมนต์สำหรับหรือต่อต้านมัน"
เอสเอฟ

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
นี่คือสุดยอด "การส่งผ่านอ้างอิง"
Dykam

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
มันค่อนข้างตรงไปตรงมา: คุณสร้างโค้ดชิ้นเล็ก ๆ (โดยปกติจะเรียกว่า "thunk" ดังนั้นปุนของฉันด้านบน) ที่คำนวณที่อยู่ซึ่งเป็นผลมาจากนิพจน์ในกรณีนี้ & a [i] ตัวชี้ไปยังฟังก์ชั่นนี้ถูกส่งผ่านไปยังฟังก์ชั่นที่เรียกว่าซึ่งจะใช้ในการคำนวณที่อยู่ปัจจุบันทุกครั้งที่มีการเข้าถึงพารามิเตอร์
Richard Pennington

189

ใน Python:

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

ไม่ใช่ WTF แต่เป็นคุณสมบัติที่มีประโยชน์


176
ฉันหวังว่าทุกภาษาจะมีคุณสมบัตินี้
vava

32
เช่นเดียวกับฟีเจอร์ Python ที่ยอดเยี่ยมทุกอย่างดูเหมือนว่า Guido เพียงแค่ ALGOL-ized ไวยากรณ์ของคุณสมบัติ Lisp ที่ยอดเยี่ยม :-)
Ken

4
Geoffrey มันเป็นคุณสมบัติและ(10 > 5 > 1) != ((10 > 5) > 1)ใน Python
sastanin

18
นอกจากนี้มันจะประเมินเพียงครั้งเดียวดังนั้นจึง(funct_a(5)+5 > b > funct_a(5))เรียกเพียงfunct_a(5)ครั้งเดียว มันเป็นคุณสมบัติที่ยอดเยี่ยม!
Khelben

57
@Khelben: ไม่funct_aจะถูกเรียกสองครั้งในตัวอย่างนั้น ในb > funct_a(5) > cมันจะถูกเรียกว่าครั้งหนึ่ง b > funct_a(5) and funct_a(5) > cแต่เมื่อเทียบกับ
Baffe Boyois

189

ใน Java:

int[] numbers() {
  return null;
}

สามารถเขียนเป็น:

int numbers() [] {
  return null;
}

23
ว้าว! ฉันหวังว่าฉันจะบินไปบนกำแพงได้เมื่อมีการออกแบบไวยากรณ์ของอาร์เรย์!
Adam Paynter

29
ฉันเกลียดที่จะพูดแบบนี้ แต่ WTF อันหนึ่งเป็นส่วนเสริมที่สอดคล้องกันของระบบประเภท C ถ้าฟังก์ชั่น C ได้รับอนุญาตให้ส่งคืนอาร์เรย์นั่นจะเป็นหน้าตาของมัน คนที่ดีกว่านั้นคือการละเมิดความสอดคล้องเพื่อให้สามารถอ่านได้มากขึ้น คล้ายกับ "const char * var" และ "char const * var"
Gordon Wrigley

15
@ อดัม - จริง ๆ แล้วสมเหตุสมผลเมื่อคุณพิจารณาว่าการประกาศตัวแปรนั้นอนุญาตทั้ง "int stuff []" และ "int [] stuff" พวกเขาปล่อยให้กฎเดียวกันทำงานเพื่อประกาศวิธีการ
Brandon Yarbrough

2
@lImbus: ที่จริงconst T*และT const*เทียบเท่าก็T* constว่า consts ตัวชี้ นอกจากนี้ฉันเกลียดแบบอักษร Sans
Simon Buchan

3
หลังจากทั้งหมดnumbers()[2]เป็นคำสั่งทางกฎหมาย
badp

184

INTERCALน่าจะเป็นบทสรุปที่ดีที่สุดของฟีเจอร์ภาษาที่แปลกประหลาดที่สุด รายการโปรดส่วนตัวของฉันคือคำสั่งCOMEFROMซึ่งเกือบตรงกันข้ามกับ GOTO

COMEFROM นั้นตรงกันข้ามกับ GOTO ซึ่งสามารถนำสถานะการดำเนินการจากจุดใดก็ได้ในรหัสไปยังคำสั่ง COMEFROM จุดในรหัสที่การถ่ายโอนสถานะที่เกิดขึ้นมักจะได้รับเป็นพารามิเตอร์ให้กับ COMEFROM การถ่ายโอนเกิดขึ้นก่อนหรือหลังคำสั่งที่จุดถ่ายโอนที่ระบุหรือไม่นั้นขึ้นอยู่กับภาษาที่ใช้ ขึ้นอยู่กับภาษาที่ใช้ COMEFROM หลายตัวที่อ้างถึงจุดออกเดินทางเดียวกันอาจไม่ถูกต้องเป็นแบบไม่กำหนดเวลาดำเนินการในลำดับความสำคัญที่กำหนดไว้บางประการหรือแม้กระทั่งกระตุ้นการดำเนินการแบบขนาน ตัวอย่างง่ายๆของคำสั่ง "COMEFROM x" คือป้าย x (ซึ่งไม่จำเป็นต้องอยู่ในตำแหน่งใด ๆ ใกล้กับ COMEFROM ที่สอดคล้องกัน) ซึ่งทำหน้าที่เป็น "กับดักประตู" เมื่อการเรียกใช้โค้ดถึงเลเบลการควบคุมจะถูกส่งผ่านไปยังคำสั่งที่ตามหลัง COMEFROM ผลของสิ่งนี้คือการแก้จุดบกพร่อง (และทำความเข้าใจกับการควบคุมการไหลของโปรแกรม) เป็นเรื่องยากมากเนื่องจากไม่มีข้อบ่งชี้ใกล้กับฉลากที่การควบคุมจะกระโดดไปยังอีกจุดหนึ่งของโปรแกรมอย่างลึกลับ


16
ค่อนข้างชั่วร้าย - เปลี่ยนป้ายกำกับเป็น GOTO ดูเหมือนว่าแฮ็กเกอร์คุณสมบัติภาษาจะขอ ...
RCIX

114
ตกลง แต่ INTERCAL น่าจะตลก - นี่ไม่ใช่ "gotcha" ที่น่าแปลกใจจริงๆ คอมไพเลอร์ INTERCAL สามารถปฏิเสธที่จะคอมไพล์โปรแกรมถ้าคุณไม่ได้ใช้PLEASEตัวดัดแปลงบ่อยครั้งพอ!
Groo

10
ฟังดูเหมือน AOP :)
akuhn

6
สิ่งที่ทำให้ฉันประหลาดใจที่สุดคือในการวิเคราะห์ความต้องการของระบบใน "World of Commercial TI" COMEFROMs ถูกนำมาใช้จริงในไฟล์ข้อความที่อธิบายถึง Use Cases (อย่างจริงจัง: นักวิเคราะห์บางคนที่นี่ล่าช้าการโยกย้ายองค์กรไปยัง OpenOffice แทน Office ของ MS เพราะอดีตไม่สามารถอ้างอิง "comefrom" อย่างถูกต้องกับความละเอียดที่จำเป็นในการเชื่อมโยง)
jsbueno

5
Groo: แย่กว่านั้น ใช้ PLEASE บ่อยเกินไปและมันก็ไม่ยอมคอมไพล์โปรแกรมของคุณเพราะคุณกำลังเซาะ (C-INTERCAL ต้องการคำสั่งระหว่าง 33% ถึง 66% ของคำสั่งให้มีตัวดัดแปลง PLEASE)
Vatine

160

ไม่ใช่คุณลักษณะทางภาษา แต่เป็นข้อบกพร่องของการใช้งาน: คอมไพเลอร์รุ่นแรก ๆ ของ Fortran บางตัวใช้ค่าคงที่โดยใช้พูลคงที่ พารามิเตอร์ทั้งหมดถูกส่งผ่านโดยการอ้างอิง หากคุณเรียกใช้ฟังก์ชันเช่น

f(1)

คอมไพเลอร์จะผ่านที่อยู่ของค่าคงที่ 1 ในพูลคงที่ไปยังฟังก์ชัน หากคุณกำหนดค่าให้กับพารามิเตอร์ในฟังก์ชันคุณจะเปลี่ยนค่า (ในกรณีนี้คือค่า 1) ทั่วโลกในโปรแกรม เกิดรอยขีดข่วนศีรษะบ้าง


124
โอ จากนั้น2+2 สามารถเท่ากับ5(สำหรับค่ามาก2แน่นอน!)
Alok Singhal

12
อืมคุณค่าอะไรของ 2 ที่จะทำให้ "2 + 2" == "5" ฉันไม่รู้ว่าค่าจำนวนเต็ม 2 สามารถใช้เพื่อให้เป็นจริง
แอรอน

36
@earlz: ฉันสงสัยว่ามันจะจบลงด้วยการเป็นค่าสำคัญของรูปแบบบิตใด ๆ ในทางกลับกันคุณอาจตั้ง 5 ถึง 4 ด้วยวิธีนั้น (ดังนั้น2+2จะเท่ากับ5ค่าเล็ก ๆ ของ5)
เดวิด ธ อร์นลี่ย์

18
ขอโทษนะ Alok แต่นี่เป็นช่วงต้นของ FORTRAN ที่เรากำลังพูดถึง มันจะไม่เป็นจริงอย่าง2 + 2 = 5นั้น นั่นจะเป็นข้อผิดพลาดทางไวยากรณ์ 2 + 2 .EQ. 5อะไรที่จะเป็นที่แท้จริงคือ
David Thornley

3
ใน Haskell ข้อมูลโค้ดต่อไปนี้ประเมินเป็น 5: "ให้ 2 + 2 = 5 ใน 2 + 2" :)
Tirpen

153

ไม่ทราบว่าสามารถพิจารณาคุณสมบัติภาษาได้หรือไม่ แต่ในภาษา C ++ เกือบทุกข้อผิดพลาดของคอมไพเลอร์ที่เกี่ยวข้องกับเทมเพลตจะส่ง WTF ไปยังโปรแกรมเมอร์ C ++ จำนวนมากทั่วโลกเป็นประจำทุกวัน :)


15
ไม่เป็นไรรหัสส่วนใหญ่ที่เกี่ยวข้องกับเทมเพลตสร้าง WTF จำนวนมากทั่วโลกอยู่แล้ว
Joris Timmermans

43
โอ้มาเลย การอ้างอิงที่ไม่ได้กำหนดถึง `std :: basic_ostream <char, std :: char_traits <char>> & std :: โอเปอเรเตอร์ << <std :: char_traits <char>> (std :: basic_ostream <char, std :: char_traits <char> > &, char const *) 'อ่านได้อย่างสมบูรณ์แบบ!
Matt Greer

10
ฉันเคยมีข้อผิดพลาดเกี่ยวกับคอมไพเลอร์ที่เกี่ยวข้องกับแม่แบบที่มีห้าบรรทัดซึ่งสั้นที่สุดคือเจ็ดหมื่นตัวอักษร (ข้อผิดพลาดคลาสสิก 'ไม่ตรงกันสำหรับ x' ในโปรแกรม templated ลึก) นั่นคือ 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

12
ฉันคิดว่าสิ่งนี้เหมาะสมที่นี่: ลองดู STLFilt ที่bdsoft.com/tools/stlfilt.htmlเพื่อให้เอาต์พุตสามารถอ่านได้
foraidt

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 ตัวระบุแท็กสำหรับ enums และ structs เป็นส่วนที่สับสนที่สุดของ C imho มีเพียงไม่กี่คนที่เข้าใจว่าทำไมสำนวนที่พิมพ์ตัวชี้ไปยังโครงสร้างนั้นมีลักษณะเป็นอย่างไร
Tadeusz A. Kadłubowski

11
มันรวบรวมเพราะทุกคนที่ฉันมีเนมสเปซที่ชัดเจนเนื่องจากบริบท
Andrew McGregor

149

ฉันจะบอกว่าสิ่งที่ช่องว่างทั้งหมดของ Python เป็นคุณสมบัติ WTF ที่ยิ่งใหญ่ที่สุดของฉัน จริงอยู่คุณจะชินกับมันมากขึ้นหลังจากผ่านไประยะหนึ่งและบรรณาธิการสมัยใหม่ทำให้มันง่ายต่อการจัดการ แต่ถึงแม้หลังจากพัฒนางูใหญ่เต็มเวลาส่วนใหญ่ในปีที่ผ่านมาฉันก็ยังเชื่อว่ามันเป็นความคิดที่แย่ ฉันได้อ่านเหตุผลทั้งหมดที่อยู่เบื้องหลัง แต่จริงๆแล้วมันได้รับในทางของการผลิตของฉัน ไม่มาก แต่ก็ยังคงเสี้ยนภายใต้อาน

แก้ไข:ตัดสินโดยความเห็นบางคนคิดว่าฉันไม่ชอบที่จะเยื้องรหัสของฉัน นั่นคือการประเมินที่ไม่ถูกต้อง ฉันเยื้องรหัสของฉันเสมอไม่ว่าจะเป็นภาษาอะไรและไม่ว่าฉันจะถูกบังคับหรือไม่ก็ตาม สิ่งที่ฉันไม่ชอบคือมันเป็นการเยื้องที่กำหนดสิ่งที่บล็อกบรรทัดของรหัสคืออะไรฉันชอบตัวคั่นที่ชัดเจนสำหรับที่ ด้วยเหตุผลอื่น ๆ ฉันพบตัวคั่นชัดเจนทำให้ง่ายต่อการตัดและวางรหัส

ตัวอย่างเช่นถ้าฉันมีบล็อกที่เว้นวรรค 4 ช่องและวางไว้ที่ส่วนท้ายของบล็อกที่มีการเว้นวรรค 8 ตัวแก้ไขของฉัน (บรรณาธิการทั้งหมดหรือไม่) ไม่มีความคิดว่ารหัสที่วางเป็นของบล็อกช่องว่าง 8 หรือด้านนอก บล็อก. OTOH ถ้าฉันมีตัวคั่นชัดเจนมันชัดเจนที่บล็อกรหัสเป็นของและวิธีการที่ควรจะเยื้อง (อีกครั้ง) เยื้อง - มันทำเช่นนั้นโดยการมองหาตัวคั่นบล็อกอย่างชาญฉลาด

แก้ไข 2:บางคนที่ให้ความเห็นดูเหมือนจะคิดว่านี่เป็นคุณสมบัติที่ฉันเกลียดหรือฉันคิดว่าทำให้หลามเป็นภาษาที่ไม่ดี อีกครั้งไม่เป็นความจริง ในขณะที่ฉันไม่ชอบมันมากขนาดนั้น คำถามเกี่ยวกับคุณลักษณะภาษาที่แปลกประหลาดที่สุดและฉันคิดว่านี่เป็นสิ่งที่แปลกโดยอาศัยการใช้ภาษาที่มีน้อยมาก (แต่> 0) ใช้ภาษา


63
หากได้รับในทางของการผลิตของคุณแล้วรหัสที่ไม่ใช่งูหลามของคุณไม่สามารถอ่านได้มาก ...
Tor Valamo

27
คุณใช้ภาษาอะไรก่อนหน้าไพ ธ อน? คุณทำงานกับผู้อื่นได้อย่างไรและไม่เยื้องภาษานั้น ทุกคนสามารถใช้โค้ดที่ไม่มีการเยื้องในภาษาใดได้อย่างไร คุณทำงานในห้องที่เต็มไปด้วยอัจฉริยะที่ไม่ต้องการตัวชี้นำภาพในซอร์สโค้ดหรือไม่?
S.Lott

53
+1 ไม่สามารถตกลงกันได้มากขึ้นหากผู้แก้ไข (Emacs) ของฉันไม่สามารถเยื้องรหัสของฉันตามสิ่งที่แตกต่าง (เช่นวงเล็บปีกกา / เริ่มต้นสิ้นสุด / คุณชื่อมัน) โดยอัตโนมัติมันโง่อย่างจริงจัง การปรับเปลี่ยนใด ๆ ที่คุณทำกับฟังก์ชั่น "ใหญ่กว่า" อาจเป็นประสบการณ์ที่แย่มาก
Dmitry

83
นี่คือข้อตกลง - ด้วยภาษาอื่นฉันสามารถไฮไลต์บล็อกของรหัสและมีการเยื้องอย่างถูกต้องโดยโปรแกรมแก้ไขใด ๆ แต่เนื่องจากช่องว่าง IS ตามคำจำกัดความการเยื้องที่เหมาะสมคุณจึงสูญเสียความสามารถใน Python ดังนั้นจึงเป็นการยากที่จะย้ายรหัสไปรอบ ๆ หรือปรับเปลี่ยนสิ่งต่าง ๆ และสำหรับคนที่อ้างว่า OP เป็น "คนแรกที่อ้างว่าเป็นปัญหา" ฉันต้องเก็บรหัสไพ ธ อนไว้ครู่หนึ่งและตอนนี้ฉันจะใช้ภาษาใด ๆ กับไพ ธ อนด้วยเหตุผลนี้
Kendall Helmstetter Gelner

38
ฉันไม่สนใจช่องว่างใน Python WTF นั้นไม่ได้บังคับใช้อย่างสม่ำเสมอ คุณสามารถผสมเยื้องระดับและแท็บตราบใดที่พวกเขาสอดคล้องกับพี่น้องของพวกเขา ดังนั้นระดับการเยื้องแรกสามารถเป็นหนึ่งในพื้นที่และที่สองสามารถเป็นสองแท็บและนี่ไม่ใช่ข้อผิดพลาดทางไวยากรณ์
ieure

138

ฉันพยายามเล็กน้อยเกี่ยวกับเรื่องนี้:

1;

ใน Perl โมดูลต้องกลับสิ่งที่เป็นความจริง


29
บางโมดูลอาจส่งคืนค่าตามการดำเนินการรันไทม์ หากคุณกลับมาจริงเสมอคุณยังไม่จำเป็นต้องสร้างสรรค์สิ่งใด
ไม่ระบุชื่อ

8
หากหน่วยความจำ Perl ของฉันให้บริการฉันอย่างถูกต้องการส่งคืนจริงจากโมดูลที่ระบุว่าโหลดโมดูลสำเร็จ การส่งคืนค่าเท็จหมายความว่ามีบางอย่างผิดปกติและจะป้องกันไม่ให้โปรแกรมทำงาน (ถ้าไม่ถูกตรวจจับ)
Barry Brown

นี่เป็นคำสั่ง C ที่ถูกต้องเช่นกันไม่มีอะไรถูกส่งคืน
sigjuice

24
มาร์คโดมินัสเขียนว่า "ฉันไม่ค่อยได้ใช้'Cogito ergo sum';ซึ่งอย่างที่ทุกคนรู้ว่าเป็นความจริงในตัวเองในทุกจักรวาลที่เป็นไปได้
Greg Bacon

PHP <?=1;?>คืนค่า 1 <?=true;?>คืน 1 <?=false;?>คืนค่า Null
Talvi Watia

135

ฉันประหลาดใจที่ไม่มีใครพูดถึง7 loop ของ Visual Basic

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" เนื่องจากมีบางคนที่ออกเสียงคำว่า "ในขณะที่" กับ veliceless labialised velar ประมาณ และแน่นอนว่ามันเข้ากันได้ดีกว่าและรหัสที่เข้าแถวก็ดี
Dreamlax

43
ทำไมคุณถึงทำตัวแปลก ๆ ?
Erik Forbes

48
ว้าว. ฉันคิดถึงอดีตเมื่อฉันคิดถึงมัน ครั้งแรกที่ฉันเคยใช้ VB กลับมาเหมือนอายุ 9 ปี ฉันมาจากสวีเดนและไม่เชี่ยวชาญภาษาอังกฤษมากนักในตอนนั้น ตอนนี้มีคำสวีเดนที่เรียกว่า "vänd" ซึ่งโดยทั่วไปหมายถึง "หันหลังกลับ" และนั่นก็ออกเสียงคล้ายกันกับ "wend" เพราะการที่ผมคิดว่ามันทำให้ความรู้สึกมาก ... :)
เอมิลเอช

61
! ไม่ได้อยู่ใน VB มันคือ "ไม่" หรือมันคืออะไร? ใช่ไม่ใช่ไม่ใช่! แต่ไม่ใช่
บาทหลวง

7
ใช่ "Wend" เป็นคำภาษาอังกฤษหมายถึงไปหรือดำเนินการต่อตามหลักสูตรหรือวิธีการบางอย่าง ( google.com/search?q=define%3A+wend ) ฉันไม่แน่ใจว่าสิ่งนั้นจะช่วยหรือเจ็บปวด
Michael Myers

134

สำหรับผู้ที่ไม่ทราบว่าbcเป็น "ภาษาเครื่องคิดเลขความแม่นยำโดยพลการ" และฉันใช้บ่อยในการคำนวณอย่างรวดเร็วโดยเฉพาะเมื่อตัวเลขที่เกี่ยวข้องมีขนาดใหญ่ ( $เป็นพรอมต์):

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

bcได้รับคำสั่ง Unix มาตรฐานมาเป็นเวลานาน

ตอนนี้สำหรับ "คุณสมบัติ WTF" นี่คือจากman bc(เหมืองเน้น):

ออกจาก : เมื่ออ่านคำสั่งเลิกหน่วยประมวลผล bc จะถูกยกเลิกโดยไม่คำนึงถึงตำแหน่งที่พบคำสั่งเลิก ตัวอย่างเช่น "if (0 == 1) quit" จะทำให้ bc ยุติ

halt : คำสั่ง halt (ส่วนขยาย) เป็นคำสั่งที่ดำเนินการซึ่งทำให้โปรเซสเซอร์ bc หยุดการทำงานเฉพาะเมื่อมีการดำเนินการ ตัวอย่างเช่น "if (0 == 1) halt" จะไม่ทำให้ bc ยุติเนื่องจาก halt ไม่ถูกดำเนินการ


41
ฉันใช้ Haskell สำหรับสิ่งนี้
Thomas Eding

8
เครื่องคิดเลขของ Google?
igul222

7
ฉันเริ่มใช้ Python ด้วยตัวเองและเครื่องคิดเลขของ Google นั้นดีถ้าคุณออนไลน์ แต่ฉันเคยใช้bcก่อนหน้านั้นและต้องการที่จะเขียนเกี่ยวกับbcในโพสต์ของฉันเพราะคำพูดที่ดีจากหน้าคน
Alok Singhal

6
@Brian แล้วคุณจะชอบ: echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(แม้ว่าคุณอาจรู้อยู่แล้ว)
Alok Singhal

2
ฉันใช้ irb (Ruby interactive shell) แต่ย้อนกลับไปในวันนั้นฉันมักจะไปถึง dc - เช่น bc แต่ใช้การขัดกลับ Geektastic!
tragomaskhalos

134

ฉันมักจะสงสัยว่าทำไมโปรแกรมที่ง่ายที่สุดคือ:

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

ในขณะที่มันอาจจะเป็น:

print "Hello World!"

บางทีนี่อาจเป็นการทำให้นักศึกษาวิทยาศาสตร์คอมพิวเตอร์หวาดกลัวในตอนแรก ...


34
ในบางภาษา "Hello World!" เป็นโปรแกรมที่ถูกต้อง
David Thornley

31
@SoMoS: ในภาษาแบบไดนามิกส่วนใหญ่เช่น Python, Ruby หรือ Perl print "Hello World!" หรือการเปลี่ยนแปลงเล็กน้อย (เช่นการพิมพ์แทนการพิมพ์) เป็นโปรแกรมที่ถูกต้องและสมบูรณ์
เดฟเคอร์บี

36
@Loadmaster: ความหมายก็คือว่า "โค้ดทั้งหมดอยู่ในชั้นเรียน" หรือ "โค้ดทั้งหมดอยู่ในฟังก์ชั่น" จะมีข้อ จำกัด ที่ไม่จำเป็น
จิมมี่

19
เพียงเพราะภาษาบังคับใช้วัตถุไม่ได้หมายความว่ามันถูกใช้สำหรับการเขียนโปรแกรมเชิงวัตถุที่เหมาะสม มันเป็นไปได้อย่างสมบูรณ์แบบในการโปรแกรมโพรซีเดอร์ใน Java หรือ C # นั่นคือสิ่งที่วิธีการคงที่มีไว้สำหรับ
jdmichal

68
ฉันรักคนที่คิดว่า OOP หมายความว่าทุกอย่างควรเป็นวัตถุ
Tor Valamo

132

JavaScript เป็นเชิงวัตถุใช่ไหม ดังนั้นการเรียกใช้เมธอดบนสตริงและตัวอักษรควรใช้งานได้ กดไลค์"hello".toUpperCase()และ 3.toString()ปรากฎว่าข้อที่สองเป็นข้อผิดพลาดทางไวยากรณ์ทำไม เนื่องจากตัวแยกวิเคราะห์คาดหวังว่าตัวเลขตามด้วยจุดจะเป็นตัวอักษรลอย นั่นไม่ใช่ WTF แต่ WTF ก็คือคุณต้องเพิ่มจุดอื่นเพื่อให้ทำงานได้:

3..toString()

เหตุผลก็คือตัวอักษร3.ถูกตีความว่าเป็น3.0และ3.0.toString()ทำงานได้ดี


8
ทำงานด้วยวิธีนี้ใน Python ด้วย (ลอง3..__add__(4)) จากนั้นอีกครั้งผมคิดว่า(3).__add__(4)เป็นน้อยสมองเสียหายวิธีที่มากที่จะทำมัน :)
badp

49
คุณสามารถทำได้ (3) .toString ()
Joseph Montanez

13
@ Gorilla3D: ใช่ แต่นั่นไม่ใช่คุณสมบัติภาษาแปลก ๆ ใช่มั้ย
Theo

25
3.0.toString()ทำให้ดวงตาของฉันคัน
Ben Blank

18
127.0.0.1.toInt ()
berkus

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 อธิบายเรื่องทั้งหมดให้ฉันฟัง: ทำไม 2 == [2] ใน JavaScript?


6
นั่นเป็นเหตุผลที่คุณควรใช้===แทน
Gumbo

10
นี่เป็นประโยชน์ btw ถ้าคุณมีฟังก์ชั่นที่คืนค่าตัวเลขและคุณต้องการคืนเมทาดาทาเพิ่มเติมด้วยคุณสามารถส่งคืน [number] ด้วยการเพิ่มฟิลด์เพิ่มเติม รหัสง่าย ๆ จะไม่มีทางรู้ว่ามันไม่ใช่จำนวนจริงและรหัสอื่น ๆ สามารถรับเมทาดาทาที่ต้องการได้
Andrey Shchekin

36
@Andrey ยกเว้นว่าถ้าฉันต้องรักษารหัสที่ทำในสิ่งที่คุณแนะนำฉันจะต้องตายเร็ว ๆ นี้กับผู้เขียน
Breton

@Andrey นั่นเป็นความคิดที่ยอดเยี่ยม! คุณยังสามารถใช้Number(n)เพื่อทำสิ่งที่คล้ายกัน น่าเสียดายที่โซลูชันของเราทั้งคู่===แตกสลาย = (.
Xavi

5
+1: ฉันคิดว่าตัวเองเป็นโปรแกรมเมอร์ js ที่มีความรู้และฉันไม่เคยรู้เรื่องนี้มาก่อน: D
Thomas Eding

126

คุณลักษณะที่น่ารังเกียจที่สุดของฉันที่สุดคือไวยากรณ์ไฟล์การกำหนดค่าใด ๆ ที่มีตรรกะตามเงื่อนไข เรื่องแบบนี้มากมายในโลกของ Java (Ant, Maven ฯลฯ คุณรู้ว่าคุณเป็นใคร!)

คุณเพิ่งจบการเขียนโปรแกรมในภาษา ac ** p พร้อมการดีบักแบบ จำกัด และรองรับการแก้ไขแบบ จำกัด

หากคุณต้องการตรรกะในการกำหนดค่าของคุณ "Pythonic" วิธีการเข้ารหัสการกำหนดค่าในภาษาจริงจะดีกว่ามาก


24
Tcl คิดค้นใหม่มานานก่อนที่ Python จะเกิดและ Lisp ได้ประดิษฐ์มันขึ้นมาก่อนหน้านั้น ดังนั้นอย่าเรียกว่า Pythonic เรียกว่า Emacs-ish
slebetman

46
ลองเรียกมันว่าถูก
mletterle

30
อาเมน หากการกำหนดค่าหรือการสร้างภาษาของคุณสมบูรณ์แบบคุณกำลังทำผิด ฉันกำลังดูคุณ CMake / autotools
โจเซฟ Garvin

16
นี่คือสิ่งที่ Lua ได้รับการออกแบบมาสำหรับในตอนแรก
Cogwheel

1
ถ้ารหัสของคุณอยู่ใน Python การกำหนดไฟล์ของคุณให้เป็นไฟล์ Python นั้นเป็นความคิดที่ดีเพราะคุณเพียงแค่นำเข้าไฟล์และอ่านคุณสมบัติของโมดูล และคุณจะได้รับ 100% ทัวริงที่สมบูรณ์ของ Python ในไฟล์ปรับแต่งของคุณ
asmeurer

113

powerbasic (www.powerbasic.com) รวมถึงคอมไพเลอร์คำสั่ง:

# BLOAT {bloatsize}

สิ่งนี้จะเพิ่มขนาดของไฟล์ประมวลผลที่คอมไพล์ด้วย<bloatsize>ไบต์ สิ่งนี้ถูกใส่ไว้ในคอมไพเลอร์ในกรณีที่ผู้ที่สร้างไฟล์ปฏิบัติการไม่ชอบขนาดที่เล็กของไฟล์ที่สร้างขึ้นได้ มันทำให้ EXE ดูใหญ่ขึ้นเพื่อแข่งขันกับภาษาการเขียนโปรแกรมป่อง :)


9
ฮ่า ๆ ๆ ๆ ฉันได้ยินเกี่ยวกับผู้พัฒนาโดยเจตนาชะลอการดำเนินการบางอย่าง (เช่นการค้นหา) เพราะมันช่วยให้ผู้คนเชื่อว่ามันกำลังทำอะไรบางอย่างจริงๆ สิ่งที่ฉันคิดว่าคล้ายกัน
David

42
สิ่งนี้ทำให้ฉันนึกถึงสิ่งที่ฉันอ่านเมื่อเร็ว ๆ นี้ พวกเขากำลังทดสอบ FPS และตัดสินใจที่จะเพิ่มจำนวนคะแนนพลังที่คนร้ายมี จากนั้นพวกเขาถามผู้ทดสอบว่าพวกเขาเป็น AI อย่างไรและพวกเขาสาบานว่าจะฉลาดกว่ามาก แต่ AI ไม่ได้เปลี่ยนแปลงเพียงแค่พลังชีวิต ผู้คนมีเรื่องเล่าเกี่ยวกับโลกในหัวของพวกเขาและถ้าคุณเข้าใจและตรงกับความคาดหวัง
เนท CK

5
ฉันเคยเพิ่มการชะลอตัวลงเป็นพิเศษจำนวนมากในโปรแกรมของฉันเพื่อทำให้ดูเหมือนว่าพวกเขากำลังทำสิ่งที่ซับซ้อน ย้อนกลับไปในโรงเรียนประถมนั่นคือ
Matti Virkkunen

3
ย้อนกลับไปที่โรงเรียนเรามี 80286 เครื่องและจริง ๆ แล้วฉันต้องเขียนรูทีนเอาท์พุทหน้าจอบางส่วนในแอสเซมบลีเพื่อให้ได้ความเร็วที่เหมาะสม (เช่นไม่คลาน)
berkus

7
CK @Nate ถ้า AI มีชีวิตอยู่นานพอที่จะอวด AI ของมันก็อาจจะจริงจะเป็นอย่างชาญฉลาดในขณะที่ก่อนมันอาจจะเสียชีวิตเร็วเกินไปที่จะพิสูจน์มัน
zzzzBov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.