งานของคุณง่าย เขียนโปรแกรมที่เห็นได้ชัดว่าควรเกิดข้อผิดพลาดในการเหลียวมองครั้งแรกไม่ว่าจะเป็นการคอมไพล์หรือรัน นี่คือการประกวดความนิยมดังนั้นจงสร้างสรรค์
งานของคุณง่าย เขียนโปรแกรมที่เห็นได้ชัดว่าควรเกิดข้อผิดพลาดในการเหลียวมองครั้งแรกไม่ว่าจะเป็นการคอมไพล์หรือรัน นี่คือการประกวดความนิยมดังนั้นจงสร้างสรรค์
คำตอบ:
ตรวจสอบให้แน่ใจว่าคุณรวบรวมรหัสต่อไปนี้ในโหมดที่สอดคล้องมาตรฐาน (ตัวอย่างเช่นสำหรับ g ++ ให้ใช้แฟล็ก -ansi):
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
มันทำงานอย่างไร:
?? / เป็นลำดับ trigraph ที่แปลเป็นแบ็กสแลชซึ่งหนีขึ้นบรรทัดใหม่ต่อไปนี้ดังนั้นบรรทัดถัดไปยังคงเป็นส่วนหนึ่งของความคิดเห็นดังนั้นจึงไม่สร้างข้อผิดพลาดทางไวยากรณ์ โปรดทราบว่าใน C ++ การละเว้นการส่งคืน
main
ถูกกำหนดไว้อย่างดีและเทียบเท่ากับการส่งคืน 0 ซึ่งบ่งชี้ว่าการรันสำเร็จ
เป็นแฟนของสิ่งนี้เสมอ
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 เราจึงไปที่อื่นและ อย่ายกข้อยกเว้น ข้อผิดพลาดนี้ชัดเจนอย่างไม่น่าเชื่อในสภาพแวดล้อมที่เน้นไวยากรณ์ใด ๆ โค้ดกอล์ฟ (?) ไม่ใช่สภาพแวดล้อมดังกล่าว
รหัสปกติสวยที่นี่ ...
void main() = main--;
มันคือ Haskell ไม่ใช่ C. มันกำหนดฟังก์ชั่นที่ชื่อว่า "void" ซึ่งรับสองอาร์กิวเมนต์ ตัวแรกมีชื่อว่า "main" และถ้าตัวที่สอง (ไม่มีชื่อ) เป็น tuple ที่ว่างเปล่ามันจะส่งคืนตัวแปร "main" "-" เริ่มแสดงความคิดเห็นใน Haskell ดังนั้น ";" ถูกใส่ความคิดเห็น
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
นี่คือวิธีการทำงาน:
อันแรก
a
คืออันที่จริงа
(นั่นคือ Cryllic Unicode "a")
เมื่อฉันให้รหัสต่อไปนี้ฉันถูกบอกหลายครั้งว่า "มันต้องเป็นตัวพิมพ์ผิด! มันจะทำงานได้อย่างไร" .
console.log( 42..toString(2) );
คำอธิบายด้านล่างถูกคัดลอกมาจากกรณีล่าสุดอย่างแน่นอน
อย่างที่คุณอาจรู้ใน JavaScript ทุกอย่างยกเว้นตัวอักษรเป็นวัตถุ ตัวเลขก็เป็นวัตถุเช่นกัน ดังนั้นในทางทฤษฎี (และจริง) คุณอาจได้รับทรัพย์สินหรือเรียกวิธีการใด ๆ ที่ไม่ใช่ตัวอักษรผ่านจุดสัญกรณ์ที่คุณทำหรือ
'string'.length
[1,2,3].pop()
ในกรณีของตัวเลขคุณอาจทำเช่นเดียวกัน แต่คุณควรจำไว้ว่าหลังจากแยกจุดเดียวแล้ว parser จะค้นหาส่วนที่เป็นเศษส่วนของจำนวนที่คาดว่าจะมีค่าลอยตัว (ตาม123.45
) ถ้าคุณใช้จำนวนเต็มคุณควรจะ "บอก" แยกวิเคราะห์ว่าส่วนที่เป็นเศษส่วนเป็นที่ว่างเปล่า,123..method()
การตั้งจุดพิเศษก่อนที่อยู่สถานที่ให้บริการ:
422
..
สัญกรณ์อย่างถ่องแท้แต่ clueless อย่างสิ้นเชิงเกี่ยวกับ.toString(a freaking argument here?)
สัญกรณ์: P โอ้ดีคิดตอนนี้ :)
..
เป็นส่วนที่ทำให้เกิดความสับสน
#!/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 ของ 20
ผลการแสดงออกทางคณิตศาสตร์คือ
[[ false ]]
ทดสอบว่าfalse
เป็นสตริงว่าง มันไม่ใช่ดังนั้นwhile
ลูปนี้จึงไม่มีที่สิ้นสุด
เนื่องจากข้างต้น
if
คำสั่งไม่เคยถูกดำเนินการดังนั้นจึงไม่พบข้อผิดพลาด
use strict;
use warnings;
Syntax error!
exit 0;
แหล่งที่มาและคำอธิบาย: https://stackoverflow.com/questions/11695110
class Gotcha {
public static void main(String... args) {
try {
main();
} finally {
main();
}
}
}
ไม่มีสแต็คล้นที่นี่ ย้ายตาม
ได้อย่างรวดเร็วก่อนนี้ควรผลิต
StackOverflowError
แต่มันไม่ได้! อันที่จริงมันแค่วิ่งไปตลอดกาล (อย่างน้อยก็เพื่อจุดประสงค์ในการใช้งานจริงโดยทางเทคนิคแล้วมันจะยุติลงหลังจากคำสั่งที่มีขนาดยาวกว่าอายุของจักรวาล) หากคุณต้องการทราบวิธีการ / ทำไมงานนี้เห็นนี้ นอกจากนี้หากคุณสงสัยว่าทำไมเราสามารถเรียกได้main()
โดยไม่มีข้อโต้แย้งเมื่อวิธีการหลักโดยทั่วไปจะต้องมีการString[]
โต้แย้ง: มันเป็นเพราะเราได้ประกาศให้มันเป็นอาร์กิวเมนต์ที่นี่ซึ่งถูกต้องสมบูรณ์
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
ตัว&
ดำเนินการใน VBScript คือการต่อสายอักขระ แต่ตัวใด&&
และ&&&
ตัวดำเนินการบนโลกคืออะไร (เรียกว่าตัวดำเนินการ "และ" ใน VBScript And
ไม่ใช่&&
)
x = 10&987&&654&&&321
ส่วนของโปรแกรมนั้นเป็น VBScript ที่ถูกกฎหมาย ทำไม? และมูลค่าของx
คืออะไร?
lexer
x = 10 & 987 & &654& & &321
แบ่งนี้ลงมาเป็น ตัวอักษรจำนวนเต็มซึ่งเริ่มต้นด้วย&
คือแปลกประหลาดพอตัวอักษรแปด ตัวอักษรฐานแปดที่ลงท้ายด้วย&
คือยิ่งจำนวนเต็มยาวพิลึกยิ่งขึ้น ดังนั้นค่าของ x10987428209
คือกำหนดการค่าทศนิยมของบรรดาสี่จำนวนเต็ม:
ไม่ใช่เรื่องใหญ่ แต่มันทำให้ฉันประหลาดใจในขณะที่พยายามใส่ลิงค์ไว้ในความคิดเห็น:
http://www.google.com
return 42;
http เป็นฉลากรหัสที่นี่ฉลากดังกล่าวจะใช้ในคำแนะนำการข้ามไป
//
ความคิดเห็น
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
เนื่องจาก
Bar
เมธอดทำ ayield
, เมธอดไม่ทำงานจริง ๆ เมื่อถูกเรียกมันส่งคืนตัวแจงนับซึ่งเมื่อทำซ้ำแล้ว s จะรันเมธอด
main=195;
ทำงานบนแพลตฟอร์ม x86 โดยที่ 195 เป็นตัวเลือกสำหรับการโทรออก ไม่ทำอะไรเลย
main
เพราะmain
ถูกวางไว้ในส่วนของข้อมูลซึ่งไม่สามารถใช้งานได้ ตลกขบขันconst int main=195
จะไม่ผิดพลาด (ใน x86) ( แต่จะผลิตออกจากสถานะขยะ) เพราะ.rodata
โดยปกติจะใส่ในกลุ่มเดียวกันเป็น.text
และดังนั้นจึงเป็นที่ปฏิบัติการ ( const char main[]="1\300\303";
จะออกจากที่ประสบความสำเร็จ! (ยังคงอยู่ที่ x86))
อาจชัดเจนเกินไป
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 ก็ยังคงปฏิบัติต่อสิ่งที่อยู่หลังโค้ดนี้เนื่องจากมันไม่ได้ถูกคอมเม้นต์อีกต่อไป
varargs
ไม่ใช่ varargs;)
\u000d
a
#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
ความเกี่ยวข้องกับพอยน์เตอร์ดังนั้นจึงเป็นไปได้ที่จะมีการอ้างถึงตัวชี้โมฆะ
NULL
เป็นnullptr
และการใช้งานที่ทำเช่นนั้น (ยังไม่มีที่ฉันรู้
print """""quintuple-quoted strings!"""""
ถูกต้องสมบูรณ์แบบ แต่ผลลัพธ์นั้นยากที่จะคาดเดา อักขระ 3 "ตัวแรกเริ่มต้นสตริงหลายบรรทัดและอีกสองบรรทัดถัดไปเป็นส่วนหนึ่งของสตริงในตอนท้ายสามบรรทัดแรกจะยุติสตริงและสองบรรทัดสุดท้ายเป็นสตริงว่างเปล่าตามตัวอักษรที่ได้รับการต่อกันโดยตัวแยกวิเคราะห์กับสตริงหลายบรรทัด .
print """""""""Python strings don't have to start with the same number of quotes they end with."""""
.
if (1/0 === -1/0) {
throw "Surely there's an error in here somewhere...";
}
มันทำงานอย่างไร:
มีค่าบวกและลบใน JS และไม่มีข้อผิดพลาดในการหารด้วยศูนย์
NaN
/ Inf
เหมือนค่าพีชคณิตปกติ บนพวกเขา) ฮาร์ดแวร์ FP สมัยใหม่สามารถกำหนดค่าให้ใช้งานได้ทั้งสองวิธี ภาษาไม่เชื่อเรื่องพระเจ้า; น่าละอายที่ไม่ทราบ
การผสม trigraphs และ lambdas ที่ไม่มีพื้นที่น้อยอาจทำให้สับสนและดูผิดไปจากคนที่ไม่ทราบ trigraphs:
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
มันทำงานอย่างไร:
บางซีเควนซ์ประกอบด้วย 3 สัญลักษณ์เริ่มต้นด้วย ?? เรียกว่า trigraphs และจะถูกแทนที่ด้วย preprocessor ที่เข้ากันได้อย่างสมบูรณ์ ประมวลผลแล้วบรรทัดที่มีปัญหาจะมีลักษณะดังนี้: return ~ [] () {return "\ x00FF"; } () [0]; อย่างที่ใครเห็นนี่คืออะไร แต่ฟังก์ชั่นแลมบ์ดาสุดยอดที่ส่งคืนสตริงที่ประกอบด้วยอักขระ 0xFFth [0]เพียงสารสกัดจากว่าตัวละครและ~ nots มันดังนั้น 0 จะถูกส่งกลับ
int main(){(([](){})());}
อาจดูดีเมื่อถูกกระตุ้น ...
[](){}
เป็นฟังก์ชั่นแลมบ์ดาเหมือนกับที่[](int a){return a+1;}
เป็นอยู่ ([](){})()
เรียกฟังก์ชั่นนั้นคืนvoid
ถ้าฉันไม่ผิด (([](){})());
จากนั้นทั้งเดือดลงไป(void);
ซึ่งเป็นคำสั่งที่ไม่ทำอะไรเลย main
จากนั้นก็ส่งกลับศูนย์เช่นเดียวกับที่ควรจะไม่มีreturn
คำสั่ง
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
การแยกสตริงที่คั่นด้วยเครื่องหมายจุลภาคที่ว่างเปล่าควรให้อาร์เรย์ที่ว่างเปล่า ควรเป็นการแบ่งที่ชัดเจนโดยไม่มีข้อผิดพลาดใช่มั้ย
Nope น่าแปลกที่เมื่อมีการแยกสตริงความยาวเป็นศูนย์ใด ๆ runtime จะให้อาร์เรย์ที่มีขอบเขตต่ำกว่า 0 และขอบเขตบนของ -1 รหัสด้านบนจะส่งออก -1
5..toString();
5 .toString();
ให้: 5
โดย:
5.toString();
ให้ SyntaxError
มันทำงานอย่างไร:
JavaScript พยายามแยกวิเคราะห์จุดบนตัวเลขเป็นตัวอักษรลอย
โพสต์แรกที่นี่ฉันไม่แน่ใจว่าฉันได้รับหรือไม่ แต่ที่นี่ไป
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
มันเป็น
.html
ไฟล์ ...
.html
ส่วนขยายและเว็บเซิร์ฟเวอร์ของคุณไม่ได้กำหนดค่าให้แยก.html
ไฟล์เป็น PHP?
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
นี่คือคำตอบที่ฉันให้ในคำถามนี้: โปรแกรมตรวจสอบความบ้า
แนวคิดคือการสร้างรหัสที่ทำให้เกิดข้อผิดพลาด
ข้อผิดพลาดที่ 1 ที่เราจะคิดว่าเป็นข้อผิดพลาดทางไวยากรณ์
ไม่มีข้อผิดพลาดทางไวยากรณ์ ...
อื่น ๆ อาจเป็นได้ว่าคลาส / ฟังก์ชั่นไม่มีอยู่
มันไม่ได้วิ่งไปไกลขนาดนั้น ...
อื่น ๆ จะเป็นการหมดเวลาหรือหน่วยความจำล้น แต่อีกครั้งมันไม่ถึง ...
ทดสอบรหัสที่นี่: http://writecodeonline.com/php/ (ลบ<?
ที่จุดเริ่มต้นเพื่อทดสอบ)
foreach(e()as&$e);
เป็นแกนหลักของการแก้ปัญหานี้ e()
เพียงเพื่อให้ตัวตรวจสอบไวยากรณ์ดำเนินต่อไปและ&$e
หลังจากนั้นas
คือสาเหตุของความล้มเหลว
ผู้ใช้ 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 ของพวกเขาและบอกว่าพวกเขาจะให้คะแนนต่ำกว่ารุ่นใหม่ แก้ไขข้อผิดพลาดเพราะพวกเขาไม่ต้องการเปลี่ยนรหัสต้นฉบับ
สิ่งนี้ทำให้ฉันนึกถึงข้อผิดพลาดที่ฉันพบเมื่อเรียนรู้ 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)
นอกจากนี้เป็นหลักสูตรการสับเปลี่ยนจึงเทียบเท่ากับ
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
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 เคล็ดลับก็คือฟังก์ชั่นการแปลงจากประเภทเป็นของตัวเอง น่าแปลกที่มาตรฐานไม่ได้ห้ามฟังก์ชั่นการแปลง - แต่มันบอกว่าไม่เคยใช้ฟังก์ชั่นดังกล่าว!
compl
operator~
operator comp
comp
function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")
'Output: :)
มันทำอะไร:
ฟังก์ชั่น, ชื่อย่อยและตัวแปรใน VBScript สามารถเป็นอะไรก็ได้ถ้าคุณใช้วงเล็บเหลี่ยม สคริปต์นี้สร้างฟังก์ชั่นที่เรียกว่า
:(
และหนึ่งอาร์กิวเมนต์"):"
แต่เนื่องจากพวกเขาไม่ปฏิบัติตามแบบแผนการตั้งชื่อปกติพวกเขาจะถูกล้อมรอบด้วยวงเล็บเหลี่ยม ค่าส่งคืนถูกตั้งค่าเป็นค่าพารามิเตอร์ เครื่องหมายโคลอนเพิ่มเติมใช้เพื่อรับทุกสิ่งในบรรทัดเดียว คำสั่ง Msgbox ได้รับการอ้างอิงถึงฟังก์ชั่น (แต่ไม่จำเป็นต้องวงเล็บ) และเรียกมันด้วยยิ้ม:)
เป็นพารามิเตอร์
ที่จริงฉันจับตัวเองทำผิดอย่างนั้น :)
public static object Crash(int i)
{
if (i > 0)
return i + 1;
else
return new ArgumentOutOfRangeException("i");
}
public static void Main()
{
Crash(-1);
}
โยนไม่กลับ
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 ซ่อนบรรทัดใหม่เพื่อเปิดใช้งานการแสดงความคิดเห็นของบรรทัดถัดไป
enum{
แทนการclass{
บันทึก byte แล้ว
สตริงและอาร์เรย์ใน 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);
}