อะไร? ไม่มีข้อผิดพลาด? [ปิด]


197

งานของคุณง่าย เขียนโปรแกรมที่เห็นได้ชัดว่าควรเกิดข้อผิดพลาดในการเหลียวมองครั้งแรกไม่ว่าจะเป็นการคอมไพล์หรือรัน นี่คือการประกวดความนิยมดังนั้นจงสร้างสรรค์


11
อืม .... อันนี้เป็นอุปกรณ์ช่วยพัฒนาสมอง +1
Tim Seguine

1
หวังว่าฉันจะพบมัน ... มีตัวอย่าง PL / I เก่าซึ่งรวมคำสั่งตามบรรทัดของ "if if = ถ้า = = = = = = = = = = = = = ไม่ = = = = = = = = = = = = คำหลักเป็นชื่อตัวแปรและมีนิพจน์เงื่อนไขคล้ายกับ C หรือไม่: ที่ใช้คำหลัก if / then / else ... )
keshlam

8
ฉันแนะนำภาษา brainfuck ทั้งหมดเพราะรหัส BF ดูเหมือนจะไม่คอมไพล์
Agi Hammerthief

@NigelNquande เฉพาะในกรณีที่คุณไม่คุ้นเคยกับมัน ... ;)
Jwosty

คำตอบ:


281

C ++

ตรวจสอบให้แน่ใจว่าคุณรวบรวมรหัสต่อไปนี้ในโหมดที่สอดคล้องมาตรฐาน (ตัวอย่างเช่นสำหรับ g ++ ให้ใช้แฟล็ก -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

มันทำงานอย่างไร:

?? / เป็นลำดับ trigraph ที่แปลเป็นแบ็กสแลชซึ่งหนีขึ้นบรรทัดใหม่ต่อไปนี้ดังนั้นบรรทัดถัดไปยังคงเป็นส่วนหนึ่งของความคิดเห็นดังนั้นจึงไม่สร้างข้อผิดพลาดทางไวยากรณ์ โปรดทราบว่าใน C ++ การละเว้นการส่งคืนmainถูกกำหนดไว้อย่างดีและเทียบเท่ากับการส่งคืน 0 ซึ่งบ่งชี้ว่าการรันสำเร็จ


7
ฉันรู้สึกเหมือนคำตอบแรกเพียงแค่ติดตั้งค้างคาวนี้ทันที
temporary_user_name

1
มันยังใช้ได้ใน C99
...

1
มีคำเตือนด้วย -Wall
BЈовић

2
@ BЈовићผนังจะเตือนทุกอย่างเสมอเกี่ยวกับทุกอย่าง
Kiwy

4
@ Kiwy มันจะส่งสัญญาณเตือนสำหรับรหัสขยะอย่างที่กล่าวไว้ด้านบนเท่านั้น - จะไม่โยนคำเตือนสำหรับทุกสิ่ง
BЈовић

86

ทับทิม

เป็นแฟนของสิ่งนี้เสมอ

x = x

NameErrorไม่ x nilอยู่ในขณะนี้

นี่เป็นเพียง "คุณสมบัติ" ของ Ruby :-)

นี่เป็นเรื่องธรรมดาที่ฉันได้รับมาก่อน:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

พิมพ์ "ไม่มีอะไรให้ดูที่นี่"

มันelsifไม่elseif (และแน่นอนว่าไม่ใช่elif - ความฉิบหายกับโปรแกรมเมอร์ python เอาแต่ใจ (ฉัน)!) เพื่อล่ามelseifดูเหมือนการเรียกใช้วิธีปกติและเนื่องจากเราไม่ได้ใส่ x <0 block เราจึงไปที่อื่นและ อย่ายกข้อยกเว้น ข้อผิดพลาดนี้ชัดเจนอย่างไม่น่าเชื่อในสภาพแวดล้อมที่เน้นไวยากรณ์ใด ๆ โค้ดกอล์ฟ (?) ไม่ใช่สภาพแวดล้อมดังกล่าว


5
คุณมีฉัน. ฉันเคยทำทั้ง Python และ Lua มาก่อนและตอนนี้เริ่มจาก Ruby ลัวะใช้สิ่งนั้น
Riking

7
ความหมายของจักรวาลไม่มีอะไรให้ดู
user80551


77

C?

รหัสปกติสวยที่นี่ ...

void main() = main--;

มันคือ Haskell ไม่ใช่ C. มันกำหนดฟังก์ชั่นที่ชื่อว่า "void" ซึ่งรับสองอาร์กิวเมนต์ ตัวแรกมีชื่อว่า "main" และถ้าตัวที่สอง (ไม่มีชื่อ) เป็น tuple ที่ว่างเปล่ามันจะส่งคืนตัวแปร "main" "-" เริ่มแสดงความคิดเห็นใน Haskell ดังนั้น ";" ถูกใส่ความคิดเห็น


21
ดังนั้นในคำอื่น ๆ มันโกง?
Mr Lister

75
การโกงเป็นเรื่องปกติในการแข่งขันที่ท้าทายรหัส เราเรียกมันว่าความคิดสร้างสรรค์ : P
Joe Z.

31
ฉันจะเรียกสิ่งนี้ว่าการโกงไม่ใช่ความคิดสร้างสรรค์ คุณต้องกำหนดสภาพแวดล้อมที่คุณใช้ก่อนจึงจะสามารถพิจารณาได้ว่ารหัสบางอย่างจะมีข้อผิดพลาดหรือไม่ มิฉะนั้นฉันจะให้คุณเสียงบรรทัดที่Malbolgeและถามคุณว่ามันรวบรวม
ทิมเอส.

5
มันควรที่จะทำให้คุณหยุดสักครู่แล้วไป 'เฮ้คุณทำอย่างนั้นได้ไหม' :)
intx13

10
@JoeZ มันอาจจะมีลักษณะเช่น Perl ในบางกรณี
user80551

72

JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

นี่คือวิธีการทำงาน:

อันแรกaคืออันที่จริงа(นั่นคือ Cryllic Unicode "a")


8
เคล็ดลับนี้สามารถใช้ได้กับทุกภาษาที่ยอมรับโทเค็น Unicode (เช่น Java, C #)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ สุดขั้วโดยชื่อผู้ใช้ของคุณ
TheDoctor

9
วิธีแก้ปัญหาที่ชัดเจนเกินไป
thepirat000

6
ชัดเจนเกินไปสำหรับทุกคนที่เคยเจอมาก่อน ฉันแน่ใจว่ามีมือใหม่จำนวนมากและอาจเรียกได้ว่า "ผู้เชี่ยวชาญทางเว็บ"
Thebluefish

42
ชัดเจน? ดังนั้นคุณมักจะดูชื่อตัวแปรของคุณผ่านหมายเลข Unicode แทนสิ่งที่พวกเขามีลักษณะอย่างไร คุณอาจสังเกตเห็นว่าหากคุณค้นหา "a" (หรือ "а"?) และไม่พบสิ่งที่คุณคาดหวัง แต่เมื่ออ่านเพียงคุณจะไม่เห็น (อย่างน้อยก็ในแบบอักษรที่แสดงที่นี่)
ทิมเอส.

70

JavaScript

เมื่อฉันให้รหัสต่อไปนี้ฉันถูกบอกหลายครั้งว่า "มันต้องเป็นตัวพิมพ์ผิด! มันจะทำงานได้อย่างไร" .

console.log( 42..toString(2) );

คำอธิบายด้านล่างถูกคัดลอกมาจากกรณีล่าสุดอย่างแน่นอน

อย่างที่คุณอาจรู้ใน JavaScript ทุกอย่างยกเว้นตัวอักษรเป็นวัตถุ ตัวเลขก็เป็นวัตถุเช่นกัน ดังนั้นในทางทฤษฎี (และจริง) คุณอาจได้รับทรัพย์สินหรือเรียกวิธีการใด ๆ ที่ไม่ใช่ตัวอักษรผ่านจุดสัญกรณ์ที่คุณทำหรือ'string'.length [1,2,3].pop()ในกรณีของตัวเลขคุณอาจทำเช่นเดียวกัน แต่คุณควรจำไว้ว่าหลังจากแยกจุดเดียวแล้ว parser จะค้นหาส่วนที่เป็นเศษส่วนของจำนวนที่คาดว่าจะมีค่าลอยตัว (ตาม123.45) ถ้าคุณใช้จำนวนเต็มคุณควรจะ "บอก" แยกวิเคราะห์ว่าส่วนที่เป็นเศษส่วนเป็นที่ว่างเปล่า, 123..method()การตั้งจุดพิเศษก่อนที่อยู่สถานที่ให้บริการ:


18
ในฐานะที่เป็นคน Lua ฉันคาดหวังว่า422
mniip

3
ไม่เคยเห็นการใช้งานนี้มาก่อนเรียบร้อยมาก
นิตย์

5
รู้สึกแย่ที่ได้คุ้นเคยกับ..สัญกรณ์อย่างถ่องแท้แต่ clueless อย่างสิ้นเชิงเกี่ยวกับ.toString(a freaking argument here?)สัญกรณ์: P โอ้ดีคิดตอนนี้ :)
David Mulder

ผลลัพธ์นี้คืออะไร และทำไม ? ฉันอยากรู้
Nicolas Barbulesco

3
สำหรับสันหลังยาวอาร์กิวเมนต์จะระบุฐาน (ดังนั้นจะพิมพ์ 42 เป็นไบนารี่) และไม่สำคัญกับรหัสนี้เลย ..เป็นส่วนที่ทำให้เกิดความสับสน
Kat

63

ทุบตี

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

ผล

  • คุณอาจคาดหวังว่าสคริปต์จะไม่สร้างข้อผิดพลาดใด ๆ เลยเนื่องจากสคริปต์จะออกจากคำสั่งแรก มันไม่ได้

  • คุณอาจคาดหวังข้อความแสดงข้อผิดพลาดทั่วไปที่เกิดจากการวางระเบิดต่อเนื่องเนื่องจากการforวนซ้ำ ไม่มีระเบิดส้อม

  • คุณอาจคาดหวังว่าทุบตีจะบ่นเกี่ยวกับmaybeคำสั่งที่ขาดหายไปหรือข้อผิดพลาดทางไวยากรณ์ทั้งหมดในifบล็อก มันจะไม่

  • เกิดข้อผิดพลาดเพียงสคริปต์ที่อาจ2: No such file or directoryผลิตในปลาย

คำอธิบาย

  • [ไม่ใช่การทุบตีพิเศษดังนั้น< 2ทำการเปลี่ยนเส้นทางตามปกติ หากไม่มีไฟล์ที่มีชื่อ2อยู่ในไดเรกทอรีปัจจุบันสิ่งนี้จะทำให้เกิดข้อผิดพลาด

  • เนื่องจากข้อผิดพลาดดังกล่าวข้างต้นคำสั่งก่อนหน้า&&จะมีสถานะออกไม่เป็นศูนย์และexitจะไม่ถูกดำเนินการ

  • การforวนซ้ำไม่สิ้นสุด ในความเป็นจริงไม่มีการวนซ้ำเลย ตั้งแต่ทุบตีไม่สามารถคำนวณพลังงาน 64 ของ 2 0ผลการแสดงออกทางคณิตศาสตร์คือ

  • [[ false ]]ทดสอบว่าfalseเป็นสตริงว่าง มันไม่ใช่ดังนั้นwhileลูปนี้จึงไม่มีที่สิ้นสุด

  • เนื่องจากข้างต้นifคำสั่งไม่เคยถูกดำเนินการดังนั้นจึงไม่พบข้อผิดพลาด


55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

แหล่งที่มาและคำอธิบาย: https://stackoverflow.com/questions/11695110


137
โปรแกรม Perl โดยทั่วไปดูเหมือนว่าข้อผิดพลาด
ugoren

1
@ugoren เฉพาะเมื่อเขียนและอ่านโดยผู้ที่มีความรู้เล็กน้อยเกี่ยวกับ Perl
TLP

8
คุณต้องรักว่าความคิดเห็นของ @ ugoren มี upvotes มากถึงสองเท่าตามคำตอบ :)
yo '

2
แจ้งเตือนฉันเกี่ยวกับเคล็ดลับเชลล์ Windows "ถ้าคุณมีความสุขและคุณรู้แล้วข้อผิดพลาดของไวยากรณ์!"
Jwosty

47

ชวา

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

ไม่มีสแต็คล้นที่นี่ ย้ายตาม

ได้อย่างรวดเร็วก่อนนี้ควรผลิตStackOverflowErrorแต่มันไม่ได้! อันที่จริงมันแค่วิ่งไปตลอดกาล (อย่างน้อยก็เพื่อจุดประสงค์ในการใช้งานจริงโดยทางเทคนิคแล้วมันจะยุติลงหลังจากคำสั่งที่มีขนาดยาวกว่าอายุของจักรวาล) หากคุณต้องการทราบวิธีการ / ทำไมงานนี้เห็นนี้ นอกจากนี้หากคุณสงสัยว่าทำไมเราสามารถเรียกได้main()โดยไม่มีข้อโต้แย้งเมื่อวิธีการหลักโดยทั่วไปจะต้องมีการString[]โต้แย้ง: มันเป็นเพราะเราได้ประกาศให้มันเป็นอาร์กิวเมนต์ที่นี่ซึ่งถูกต้องสมบูรณ์


3
ตามคำถามที่คุณเชื่อมโยงอธิบายมันไม่ได้ทำงานไปเรื่อย ๆ แต่เป็นเวลานานมาก
Kevin

1
@Kevin อย่ามาอวดความรู้ที่นี่โดยไม่จำเป็น "นานกว่าอายุของเอกภพ" คือเพื่อจุดประสงค์ในทางปฏิบัติ "ตลอดไป"
arshajii

8
คุณพูดว่า "ไม่มีการล้นสแต็กที่นี่" ในความเป็นจริงแล้วระบบจะทำการขว้างโอเวอร์โฟลว์อย่างต่อเนื่องและในที่สุดจะทำให้เกิดข้อยกเว้นสแต็กล้น (ตามที่คุณพูดถึงในที่สุดอาจเป็นเวลานานมาก) และขึ้นอยู่กับความลึกของกองซ้อน บน VM ขนาดเล็กหรือระบบฝังตัวความลึกของสแต็กอาจน้อยกว่ามาก
แมคเคย์

@McKay คำสั่งนั้นชัดเจนว่าเป็นเพียงสายการเดินเรือไม่ใช่หมายถึงการดำเนินการอย่างแท้จริง OP ขอโปรแกรมที่ดูเหมือนว่าจะเกิดข้อผิดพลาด แต่ไม่ทำ ในกรณีทั่วไปคำตอบข้างต้นเป็นไปตามข้อกำหนดนี้ แน่นอนว่าเราสามารถปรุงสถานการณ์ที่คลุมเครือในที่ที่มันไม่ได้ แต่นั่นไม่ได้ทำให้คำตอบไม่ถูกต้อง ฉันหวังว่าคุณจะพิจารณา downvote ของคุณอีกครั้ง
arshajii

3
@McKay โดยวิธีการที่ถือว่าขนาดสแต็คที่เป็นขนาดเล็ก (เช่น 100 เมื่อเทียบกับปกติ ~ 10,000) และเราสามารถยังคงทำให้ 10,000,000 โทรต่อวินาที จากนั้นเวลาทั้งหมดที่ใช้ในการผลิตจะเท่ากับ 4,019,693,684,133,147 ปีซึ่งยังคงมีขนาดของคำสั่งที่ใหญ่กว่ายุคของจักรวาล
arshajii

42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?ตามด้วยช่องว่างคือโอเปอเรเตอร์ที่เรียกใช้ฟังก์ชัน แต่ถ้ามีอยู่เท่านั้น JavaScript ไม่มีฟังก์ชั่นที่เรียกว่าWhatดังนั้นจึงไม่ได้เรียกใช้ฟังก์ชันและอาร์กิวเมนต์ของมันจะถูกละเว้น คำอื่น ๆ ในรหัสเป็นการเรียกใช้ฟังก์ชันที่จริง ๆ แล้วไม่ได้ถูกเรียกใช้เนื่องจากWhatไม่มีฟังก์ชันอยู่ ในตอนท้าย?เป็นผู้ดำเนินการที่มีอยู่ในขณะที่มันไม่ได้ใช้ในฟังก์ชั่นการโทร ส่วนประโยคอื่น ๆ เช่น.หรือ!ไม่สามารถใช้งานได้.มีไว้สำหรับวิธีการและ!ไม่ใช่ตัวดำเนินการ (ซึ่งไม่สามารถใช้งานได้หลังจากตัวระบุ) หากต้องการอ่านวิธีที่ CoffeeScript แปลงค่านี้เป็น JavaScript ให้ไปที่http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20thth%20code%20does%20not% 20any%20bugs%2C % 20why% 20it% 20would% 3F


36

VBScript

ตัว&ดำเนินการใน VBScript คือการต่อสายอักขระ แต่ตัวใด&&และ&&&ตัวดำเนินการบนโลกคืออะไร (เรียกว่าตัวดำเนินการ "และ" ใน VBScript Andไม่ใช่&&)

x = 10&987&&654&&&321

ส่วนของโปรแกรมนั้นเป็น VBScript ที่ถูกกฎหมาย ทำไม? และมูลค่าของxคืออะไร?

lexer x = 10 & 987 & &654& & &321แบ่งนี้ลงมาเป็น ตัวอักษรจำนวนเต็มซึ่งเริ่มต้นด้วย&คือแปลกประหลาดพอตัวอักษรแปด ตัวอักษรฐานแปดที่ลงท้ายด้วย&คือยิ่งจำนวนเต็มยาวพิลึกยิ่งขึ้น ดังนั้นค่าของ x 10987428209คือกำหนดการค่าทศนิยมของบรรดาสี่จำนวนเต็ม:


8
นั่นเป็นเพียง ... ว้าว
primo

27

Objective-C

ไม่ใช่เรื่องใหญ่ แต่มันทำให้ฉันประหลาดใจในขณะที่พยายามใส่ลิงค์ไว้ในความคิดเห็น:

http://www.google.com
        return 42;

http เป็นฉลากรหัสที่นี่ฉลากดังกล่าวจะใช้ในคำแนะนำการข้ามไป


8
สิ่งนี้ควรทำงานในภาษา C ที่สนับสนุน//ความคิดเห็น
Ilmari Karonen

ใช่ฉันไม่แน่ใจในขณะที่โพสต์
Piotr

14
อย่างไรก็ตาม จำกัด หนึ่ง URL ต่อโปรโตคอลต่อขอบเขต
Ben Voigt

1
คุณยังสามารถใช้ https: // ในขอบเขตเดียวกัน
Florian F

25

C #

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

เนื่องจากBarเมธอดทำ a yield, เมธอดไม่ทำงานจริง ๆ เมื่อถูกเรียกมันส่งคืนตัวแจงนับซึ่งเมื่อทำซ้ำแล้ว s จะรันเมธอด


ในที่สุด ... นี่คือ FOO และ BAR :)
VVK

1
นั่นคือสิ่งที่ foo และ bar for;) ชื่อของสิ่งต่าง ๆ ที่ไม่สำคัญ
แมคเคย์

22

C

main=195;

ทำงานบนแพลตฟอร์ม x86 โดยที่ 195 เป็นตัวเลือกสำหรับการโทรออก ไม่ทำอะไรเลย


opcode สำหรับ ret คือ 195 ไม่ใช่ 193 ใช่ไหม
Dennis

ใช้งานไม่ได้สำหรับฉัน ฉันคาดหวังว่าสิ่งนี้จะรันโค้ดที่ที่อยู่ 195
nwellnhof

Tbanks @Dennis รหัสถูกต้องคำอธิบายผิด
ugoren

3
บนแพลตฟอร์มใด ๆ (รวมถึงx86 ที่ทันสมัย ) ซึ่งหน้าสามารถอ่านได้โดยไม่ต้องมีการปฏิบัติการสิ่งนี้จะผิดพลาดเมื่อเข้าสู่mainเพราะmainถูกวางไว้ในส่วนของข้อมูลซึ่งไม่สามารถใช้งานได้ ตลกขบขันconst int main=195จะไม่ผิดพลาด (ใน x86) ( แต่จะผลิตออกจากสถานะขยะ) เพราะ.rodataโดยปกติจะใส่ในกลุ่มเดียวกันเป็น.textและดังนั้นจึงเป็นที่ปฏิบัติการ ( const char main[]="1\300\303";จะออกจากที่ประสบความสำเร็จ! (ยังคงอยู่ที่ x86))
zwol

2
ฉันอยู่บนเครื่อง 64 บิต (ฉันไม่รู้ว่ามันจะเปลี่ยนแปลงอะไร) และ main = 195 ให้ segfault แต่ const int main = 195; โรงงาน
w4etwetewtwet

21

ชวา

อาจชัดเจนเกินไป

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

อะไร?

\u000dพ่นไวยากรณ์ผิดพลาดหลังจากที่ \u000dเป็น Unicode สำหรับบรรทัดใหม่ ถึงแม้ว่ามันจะถูกคอมเม้นต์ แต่คอมไพเลอร์ Java ก็ยังคงปฏิบัติต่อสิ่งที่อยู่หลังโค้ดนี้เนื่องจากมันไม่ได้ถูกคอมเม้นต์อีกต่อไป


11
ของคุณvarargsไม่ใช่ varargs;)
Navin

คำถามคือ "รหัสที่ดูเหมือนว่าจะล้มเหลว แต่ไม่ใช่" ไม่ใช่ "รหัสที่ดูเหมือนว่าจะล้มเหลว แต่ทำในวิธีที่ต่างออกไป" การมีข้อผิดพลาดทางไวยากรณ์แทนข้อยกเว้นยังคงเป็นข้อผิดพลาด
Nzall

19
ฉันคิดว่าคุณควรอ่านคำถามเดิมอีกครั้ง: "หรือสร้างข้อผิดพลาดที่ไม่เกี่ยวข้องอื่น ๆ "
Tom Verelst

ที่จริงโดยไม่ต้องก็จะใช้การอ้างอิงไปยังไม่ได้กำหนดค่า\u000d a
LegionMammal978

19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

ทำไม?

NULLเป็นค่าคงที่ระหว่างกาลดังนั้นจึงจับคู่intโอเวอร์โหลดได้ดีกว่าค่าint*หนึ่งอย่างเคร่งครัด ยังโปรแกรมเมอร์ส่วนใหญ่มีNULLความเกี่ยวข้องกับพอยน์เตอร์ดังนั้นจึงเป็นไปได้ที่จะมีการอ้างถึงตัวชี้โมฆะ


11
โชคดีที่ C ++ 11 อนุญาตให้การใช้งานเพื่อกำหนดNULLเป็นnullptrและการใช้งานที่ทำเช่นนั้น (ยังไม่มีที่ฉันรู้
hvd

16

หลาม

print """""quintuple-quoted strings!"""""

ถูกต้องสมบูรณ์แบบ แต่ผลลัพธ์นั้นยากที่จะคาดเดา อักขระ 3 "ตัวแรกเริ่มต้นสตริงหลายบรรทัดและอีกสองบรรทัดถัดไปเป็นส่วนหนึ่งของสตริงในตอนท้ายสามบรรทัดแรกจะยุติสตริงและสองบรรทัดสุดท้ายเป็นสตริงว่างเปล่าตามตัวอักษรที่ได้รับการต่อกันโดยตัวแยกวิเคราะห์กับสตริงหลายบรรทัด .


20
แค่โบนัส: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski

15

JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

มันทำงานอย่างไร:

มีค่าบวกและลบใน JS และไม่มีข้อผิดพลาดในการหารด้วยศูนย์


2
คุณน่าจะสามารถเล่นกลกับ NaN ได้เช่นกัน ...
intx13

8
meh สิ่งนี้เกิดขึ้นในภาษาใด ๆ กับลอย
Navin

3
@Navin: ในภาษาใด ๆ ที่มีการลอยโดยที่การหารด้วยศูนย์จะไม่ทำให้เกิดข้อผิดพลาด
nwk

2
@nwk มาตรฐาน IEEE สำหรับการบอกว่าการหารด้วยศูนย์จะต้องเป็น inf ฉันไม่รู้ภาษาที่เปลี่ยนแปลงสิ่งนี้
Navin

1
IEEE 754 ระบุสองรุ่น: การส่งสัญญาณ NaN / Inf (ซึ่งเพิ่มข้อยกเว้นในการหารศูนย์ FP, สแควร์รูทจาก -1, อันเดอร์โฟล / โอเวอร์โฟลว์ ฯลฯ ) และการไม่ส่งสัญญาณ (ซึ่งถือว่าNaN/ Infเหมือนค่าพีชคณิตปกติ บนพวกเขา) ฮาร์ดแวร์ FP สมัยใหม่สามารถกำหนดค่าให้ใช้งานได้ทั้งสองวิธี ภาษาไม่เชื่อเรื่องพระเจ้า; น่าละอายที่ไม่ทราบ
ulidtko

14

C ++

การผสม trigraphs และ lambdas ที่ไม่มีพื้นที่น้อยอาจทำให้สับสนและดูผิดไปจากคนที่ไม่ทราบ trigraphs:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

มันทำงานอย่างไร:

บางซีเควนซ์ประกอบด้วย 3 สัญลักษณ์เริ่มต้นด้วย ?? เรียกว่า trigraphs และจะถูกแทนที่ด้วย preprocessor ที่เข้ากันได้อย่างสมบูรณ์ ประมวลผลแล้วบรรทัดที่มีปัญหาจะมีลักษณะดังนี้: return ~ [] () {return "\ x00FF"; } () [0]; อย่างที่ใครเห็นนี่คืออะไร แต่ฟังก์ชั่นแลมบ์ดาสุดยอดที่ส่งคืนสตริงที่ประกอบด้วยอักขระ 0xFFth [0]เพียงสารสกัดจากว่าตัวละครและ~ nots มันดังนั้น 0 จะถูกส่งกลับ


12
โปรแกรม C ++ ที่ถูกต้องint main(){(([](){})());}อาจดูดีเมื่อถูกกระตุ้น ...
Angew

1
คนนั้นทำอะไรกัน
Joe Z.

1
@Joe Z [](){}เป็นฟังก์ชั่นแลมบ์ดาเหมือนกับที่[](int a){return a+1;}เป็นอยู่ ([](){})()เรียกฟังก์ชั่นนั้นคืนvoidถ้าฉันไม่ผิด (([](){})());จากนั้นทั้งเดือดลงไป(void);ซึ่งเป็นคำสั่งที่ไม่ทำอะไรเลย mainจากนั้นก็ส่งกลับศูนย์เช่นเดียวกับที่ควรจะไม่มีreturnคำสั่ง
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

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

Nope น่าแปลกที่เมื่อมีการแยกสตริงความยาวเป็นศูนย์ใด ๆ runtime จะให้อาร์เรย์ที่มีขอบเขตต่ำกว่า 0 และขอบเขตบนของ -1 รหัสด้านบนจะส่งออก -1


@minitech จริง ๆ แล้วถ้าคุณส่งอาเรย์ที่ว่างไปยัง UBound มันจะทำให้เกิดข้อผิดพลาด Subscript out of range
Comintern

…ดี ฉันเอามันกลับมา VBA = /
Ry-

1
@minitech Yep ฉันเข้าใจว่านี่เป็นข้อผิดพลาดในการใช้ Split แบบเดิมใน VB6 ใน. NET พวกเขาจงใจ "เพิ่ม" (หรืออาจทำเป็นเอกสารเป็นคำที่ดีกว่า) พฤติกรรมสำหรับอาร์เรย์ว่างที่คืนค่า UBound -1 เพื่อรักษาความเข้ากันได้ย้อนหลังกับรหัส VB6 ทั้งหมดที่ใช้ประโยชน์จากการแฮ็คนี้ การแยกสตริง null เป็นวิธีเดียวที่จะได้รับอาร์เรย์นี้ใน VBA / VB6 โดยไม่ต้องมีการเรียก Windows API
Comintern

12

จาวาสคริ

5..toString();
5 .toString();

ให้: 5

โดย:

5.toString();

ให้ SyntaxError

มันทำงานอย่างไร:

JavaScript พยายามแยกวิเคราะห์จุดบนตัวเลขเป็นตัวอักษรลอย


13
มันเกิดขึ้นได้อย่างไรว่าคุณโพสต์กรณีเดียวกันทุกชั่วโมงหลังจากฉัน?
VisioN

1
เฮ้วิชั่นขออภัย แต่ฉันไม่ได้ตรวจสอบคำตอบของคุณ ฉันยังเพิ่มเคสด้วยช่องว่าง ฉันอ่านข้อความนี้ครั้งเดียวใน javascript garden ไม่มีอะไรอื่นอีกแล้ว
Sumeet Kashyap

1
สรุปแล้วอย่าเสียใจ คำตอบของคุณดีกว่าและชัดเจนกว่าคำตอบของ @VisioN
Nicolas Barbulesco

12

HTML

โพสต์แรกที่นี่ฉันไม่แน่ใจว่าฉันได้รับหรือไม่ แต่ที่นี่ไป

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

มันเป็น.htmlไฟล์ ...


9
ดังนั้นเคล็ดลับก็คือว่ามันจะไม่ดำเนินการบล็อก PHP เพราะไฟล์ที่มี.htmlส่วนขยายและเว็บเซิร์ฟเวอร์ของคุณไม่ได้กำหนดค่าให้แยก.htmlไฟล์เป็น PHP?
VisioN

5
ใช่. นี่เป็นการโกงหรือไม่? @VisioN
Albzi

2
ฉันค่อนข้างมั่นใจว่านี่เป็นการโกง อย่างน้อยเขียน "HTML" เป็นตัวหนาที่ด้านบน
Navin

เยี่ยมมาก! :-) เคล็ดลับการทำงานกับฉัน
Nicolas Barbulesco

1
ฉันแก้ไขเพื่อให้ชัดเจนว่าภาษานี้เขียนในอะไร
vijrox

9

PHP (40 ไบต์)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

นี่คือคำตอบที่ฉันให้ในคำถามนี้: โปรแกรมตรวจสอบความบ้า

แนวคิดคือการสร้างรหัสที่ทำให้เกิดข้อผิดพลาด

ข้อผิดพลาดที่ 1 ที่เราจะคิดว่าเป็นข้อผิดพลาดทางไวยากรณ์

ไม่มีข้อผิดพลาดทางไวยากรณ์ ...

อื่น ๆ อาจเป็นได้ว่าคลาส / ฟังก์ชั่นไม่มีอยู่

มันไม่ได้วิ่งไปไกลขนาดนั้น ...

อื่น ๆ จะเป็นการหมดเวลาหรือหน่วยความจำล้น แต่อีกครั้งมันไม่ถึง ...

ทดสอบรหัสที่นี่: http://writecodeonline.com/php/ (ลบ<?ที่จุดเริ่มต้นเพื่อทดสอบ)


3
นี่คือการประกวดความนิยม ไม่จำเป็นต้องบีบอัดโค้ดของคุณเพื่อบันทึกไบต์ เพียงฟอร์แมตใหม่เพื่อให้อ่านง่ายขึ้น;)
Songo

ฉันจะเพิ่มเวอร์ชันที่อ่านได้ในภายหลัง ฉันใช้คำตอบที่แน่นอนเหมือนกันและไม่ได้แก้ไขเลย
Ismael Miguel

foreach(e()as&$e);เป็นแกนหลักของการแก้ปัญหานี้ e()เพียงเพื่อให้ตัวตรวจสอบไวยากรณ์ดำเนินต่อไปและ&$eหลังจากนั้นasคือสาเหตุของความล้มเหลว
TheConstructor

ที่จริงแล้วทุกอย่างมีบทบาทสำคัญ
Ismael Miguel

9

VBScript

ผู้ใช้ Visual Basic 6 จะรู้ว่า

If Blah Then Foo Bar

ถูกกฎหมายตามที่เป็นอยู่

If Blah Then 
    Foo Bar
End If

แต่สิ่งที่เกี่ยวกับ

If Blah Then Foo Bar End If

? เปิดใช้งานที่ถูกกฎหมายใน VBScript แต่ไม่ใช่ใน VB6 ทำไม?

มันเป็นข้อผิดพลาดใน parser; ความตั้งใจที่จะปฏิเสธเรื่องนี้ รหัสที่ตรวจพบEnd Ifควรจะตรวจสอบว่ามันเป็นIfคำสั่งหลายบรรทัดและมันก็ไม่ได้ เมื่อฉันพยายามที่จะแก้ไขและส่งเบต้าพร้อมด้วยการแก้ไของค์กรข่าวที่มีอิทธิพลในอุตสาหกรรมบางแห่งค้นพบว่าพวกเขามีรหัสบรรทัดนี้ในหนึ่งในโปรแกรม VBScript ของพวกเขาและบอกว่าพวกเขาจะให้คะแนนต่ำกว่ารุ่นใหม่ แก้ไขข้อผิดพลาดเพราะพวกเขาไม่ต้องการเปลี่ยนรหัสต้นฉบับ


มีข้อเสียใด ๆ ในการปล่อยข้อผิดพลาดที่ไม่คงที่นอกเหนือจากการอนุญาตให้คุณเขียนโค้ด VBS ที่ไม่ถูกต้องใน VB6 หรือไม่?
Gabe

1
@Gabe: ไม่ไม่มีข้อเสียนอกจากจะยากกว่าในการแปลงรหัส VBScript เป็น VB
Eric Lippert

1
ชื่อ ! ใครคือองค์กรข่าวนี้
Nicolas Barbulesco

9

C

สิ่งนี้ทำให้ฉันนึกถึงข้อผิดพลาดที่ฉันพบเมื่อเรียนรู้ C. น่าเสียดายที่ตัวแปรดั้งเดิมดูเหมือนจะไม่ทำงานกับ GCC ปัจจุบัน แต่สิ่งนี้ยังคง:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

เห็นได้ชัดว่า segfaults เพราะเราอ้างถึงตัวชี้โมฆะใช่ไหม

ผิด - จริง ๆ แล้วมันเป็นลูปไม่สิ้นสุดเนื่องจากสภาพลูปของเราถูกปิดโดยหนึ่ง เนื่องจากการลดจำนวนคำนำหน้าให้iเรียกใช้จาก 1,023 ถึง -1 นี่หมายถึงการมอบหมายนั้นไม่เพียงเขียนทับองค์ประกอบทั้งหมดเท่านั้นarrแต่ยังรวมถึงตำแหน่งหน่วยความจำก่อนหน้าด้วยซึ่งจะเป็นสถานที่ที่iจัดเก็บไว้ เมื่อถึง-1, iเขียนทับตัวเองด้วย0และทำให้เงื่อนไขลูปเป็นจริงอีกครั้ง ...

นี่คือตัวแปรดั้งเดิมที่ฉันไม่สามารถทำซ้ำได้อีก:

สิ่งเดียวกันทำงานกับการiเพิ่มขึ้นจาก 0 และถูกปิดโดยหนึ่ง GCC ล่าสุดเก็บไว้ในหน่วยความจำiก่อนเสมอ arrสิ่งนี้จะต้องแตกต่างกันในรุ่นเก่ากว่า (อาจขึ้นอยู่กับลำดับการประกาศ) มันเป็นข้อผิดพลาดจริงที่ฉันสร้างขึ้นในหนึ่งในโปรแกรมของเล่นแรกของฉันที่เกี่ยวข้องกับอาร์เรย์

สิ่งนี้ชัดเจนถ้าคุณรู้ว่าพอยน์เตอร์ทำงานอย่างไรใน C แต่น่าแปลกใจถ้าคุณไม่:

คุณอาจคิดว่ามอบหมายให้(--i)[arr]โยนข้อผิดพลาด arr[--i]แต่มันเป็นเรื่องที่ถูกต้องและเทียบเท่ากับ นิพจน์a[x]นั้นเป็นเพียงน้ำตาลซิน*(a + x)แทกติกที่จะคำนวณและกำหนดตัวชี้ไปยังองค์ประกอบที่จัดทำดัชนี *(x + a)นอกจากนี้เป็นหลักสูตรการสับเปลี่ยนจึงเทียบเท่ากับ


1
เท่าที่ฉันเห็นร่างกายของลูปไม่ควรถูกดำเนินการ (เพราะ 1234 <= 0 ประเมินว่าเป็นเท็จ) คุณอาจหมายถึงการเขียน "> ="?
celtschk

1
@celtschk ใช่นั่นเป็นตัวพิมพ์ผิด ขอบคุณที่สังเกต!
l4mpi

การจัดเรียงหน่วยความจำนี้มีการระบุจริงหรือไม่หรือใช้วิธีนี้ในคอมไพเลอร์บางตัว?
Paŭlo Ebermann

9

ชวา

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

ทำไมจึงใช้งานได้:

เขตข้อมูลที่เป็นหน่วยมีค่าเริ่มต้น ในกรณีนี้dเป็นเพียง0 0/0 = น่านในการแบ่งคู่และน่านไม่เคยเท่ากับตัวเองดังนั้นถ้าส่งกลับเท็จ หมายเหตุนี้จะไม่ทำงานถ้าคุณมี0/0 == 0/0ณ วันที่จะเป็นจำนวนเต็ม0/0ส่วนจะ WOULD โยนArithmeticException


8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

รวบรวมและทำงานโดยไม่มีคำเตือนใด ๆ g++ -pedantic-errors -std=c++11กับ

complเป็นทางเลือกการสะกดมาตรฐาน~เช่นเดียวกับเป็นทางเลือกสำหรับ not ถูกใช้ที่นี่เพื่อแทนที่แรกจากนั้นกำหนด destructor เคล็ดลับก็คือฟังก์ชั่นการแปลงจากประเภทเป็นของตัวเอง น่าแปลกที่มาตรฐานไม่ได้ห้ามฟังก์ชั่นการแปลง - แต่มันบอกว่าไม่เคยใช้ฟังก์ชั่นดังกล่าว!comploperator~operator compcomp


8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

มันทำอะไร:

ฟังก์ชั่น, ชื่อย่อยและตัวแปรใน VBScript สามารถเป็นอะไรก็ได้ถ้าคุณใช้วงเล็บเหลี่ยม สคริปต์นี้สร้างฟังก์ชั่นที่เรียกว่า:(และหนึ่งอาร์กิวเมนต์"):"แต่เนื่องจากพวกเขาไม่ปฏิบัติตามแบบแผนการตั้งชื่อปกติพวกเขาจะถูกล้อมรอบด้วยวงเล็บเหลี่ยม ค่าส่งคืนถูกตั้งค่าเป็นค่าพารามิเตอร์ เครื่องหมายโคลอนเพิ่มเติมใช้เพื่อรับทุกสิ่งในบรรทัดเดียว คำสั่ง Msgbox ได้รับการอ้างอิงถึงฟังก์ชั่น (แต่ไม่จำเป็นต้องวงเล็บ) และเรียกมันด้วยยิ้ม:)เป็นพารามิเตอร์


1
ใบหน้าที่ขมวดคิ้วมากมาย :(
โจซี

8

C #

ที่จริงฉันจับตัวเองทำผิดอย่างนั้น :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

โยนไม่กลับ


ฮ่าฮ่ายินดีต้อนรับสู่เว็บไซต์! ขอชื่นชมความกล้าหาญของสิ่งนี้เป็นโพสต์แรก :)
Jonathan Van Matre

7

ชวา

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

และวิธีการที่ทำงาน:

ภาคเรียนที่คุณคิดว่า Enum ไม่ถูกต้อง แต่ถูกต้อง จากนั้นคุณคิดว่ามันจะพิมพ์แอตทริบิวต์ของวัตถุ Point แบบมาตรฐาน แต่ Gotcha! เนื่องจากวิธีที่ Snakeyaml ทำให้อนุกรมคุณได้รับข้อผิดพลาด StackOverFLow ที่ราบรื่น

และอีกหนึ่ง:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

คุณคิดว่า Stackoverflow จะเกิดขึ้นเนื่องจากการเรียกซ้ำที่ชัดเจน แต่โปรแกรมละเมิดความจริงที่ว่าเมื่อคุณเรียกใช้มันstatic{} blockจะถูกดำเนินการก่อนและเนื่องจากมันออกก่อนโหลดหลัก ()

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

อันนี้ขึ้นอยู่กับว่า - /*Error*/ใส่รหัสออกเป็นจุดปิดสำหรับความคิดเห็นที่เปิดก่อนที่จะ ab = 0; อธิบายเกี่ยวกับจำนวนเต็ม ab ถึง 0x000d ซ่อนบรรทัดใหม่เพื่อเปิดใช้งานการแสดงความคิดเห็นของบรรทัดถัดไป


1
ฉันไม่สามารถตอนนี้ แต่มันจะดีถ้าคุณจะจัดรูปแบบนี้ถ้าเป็นไปได้ อ่านยากนิดหน่อย ... : P
Jwosty

ทำให้ em ชัดเจนมากขึ้น และแท็กสปอยเลอร์ตั้งใจทำให้เทคนิคไม่ชัดเจนในตอนแรก
masterX244

2
รอสักครู่ดังนั้นคนแรกไม่จริงสร้างข้อผิดพลาดหรือไม่ นั่นคือสิ่งที่ตรงกันข้ามกับคำถามที่ถาม และทำไมไม่เพียงแค่ System.exit (1) ในครั้งที่สอง?
Riking

3
ไม่มีโปรแกรมเมอร์ Java ที่คาดหวังว่าสแต็กล้นในตัวอย่างที่สอง ขออภัยที่ชัดเจนเกินไป
Tobias

1
@VVK codegolfing นิสัยที่จะใช้enum{แทนการclass{บันทึก byte แล้ว
masterX244

6

C

สตริงและอาร์เรย์ใน c อาจสร้างความสับสนได้

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}

9
มันอ่านยาก แต่ฉันไม่รู้ว่าคนประเภทไหนที่คาดหวังจากข้อผิดพลาดนี้
ไบรอันเฉิน

3
ฉันแค่อยากจะเตือนผู้คนถึงสิ่งที่ถูกต้อง แต่ไม่ธรรมดา - ทำให้เป็นอย่างที่คุณต้องการ แน่นอนฉันจะดูสามครั้งก่อนที่จะบอกว่าถูกต้อง ก่อนอื่นนิพจน์เช่น 5 [string] นั้นไม่เป็นที่รู้จักกันดีใน coder ทั่วไปและท้าทายตรรกะของการทำดัชนีอาร์เรย์ ประการที่สองสตริง '' + ดูเหมือนการเพิ่ม 2 สตริง แต่มีประเภทของคำพูดที่ไม่ถูกต้อง และประการที่สาม & i ++ ดูเหมือนว่าที่อยู่ของจำนวนเต็ม (แต่สิ่งที่สำคัญกว่านั้นคือการดูแล) สุดท้ายเรากำลังเขียนเกินตัวอักษรสตริง (แต่ไม่เกินบัฟเฟอร์สำรองที่ใหญ่กว่า)
orion

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