Göreviniz basit. Derlendiğinde veya çalıştırıldığında ilk bakışta bir hataya yol açacak, ancak derhal veya başka bir ilgisiz hata üretecek bir program yazın. Bu bir popülerlik yarışması, bu yüzden yaratıcı olun.
Göreviniz basit. Derlendiğinde veya çalıştırıldığında ilk bakışta bir hataya yol açacak, ancak derhal veya başka bir ilgisiz hata üretecek bir program yazın. Bu bir popülerlik yarışması, bu yüzden yaratıcı olun.
Yanıtlar:
Aşağıdaki kodu standart uygunluk modunda derlediğinizden emin olun (örneğin, g ++ için -ansi bayrağını kullanın):
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
Nasıl çalışır:
/ /, Aşağıdaki yeni satırdan kaçan ters eğik çizgiye çevrilmiş bir trigraph dizisidir, bu nedenle sonraki satır hala yorumun bir parçasıdır ve bu nedenle bir sözdizimi hatası oluşturmaz. C ++ 'da geri dönüşün ihmal edilmesinin
main
iyi tanımlanmış ve başarılı bir çalışma olduğunu belirten 0 dönüşüne eşdeğer olduğunu unutmayın.
Her zaman bunun hayranıyım.
x = x
Hayır NameError
. x şimdi nil
.
Bu Ruby'nin sadece bir "özelliği" dir.
İşte daha önce beni ele geçiren daha sıradan bir tane:
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
"Burada görecek bir şey yok" yazıyor.
Bu oluyor elsif değil elseif . (ve değil kesinlikle var elif tercüman So - nazlı piton programcı (ben) vay haline!) elseif normal yöntem çağrısı gibi görünüyor ve biz x <0 bloğunu girmezseniz yana, doğruca gidip başka ve bir istisna oluşturma. Bu hata sözdizimi vurgulayan herhangi bir ortamda inanılmaz derecede açıktır, neyse ki (?) Kod golf böyle bir ortam değildir.
Burada oldukça normal kod var.
void main() = main--;
Haskell, C değil. İki argüman alan "void" adlı bir işlevi tanımlar. İlki "main" olarak adlandırılır ve ikincisi (adsız) boş bir demet ise "main" değişkenini döndürür. "-" Haskell'de bir yorum başlatır, bu nedenle ";" yorumlandı.
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
İşte nasıl çalışıyor:
Birincisi
a
aslında birа
(yani, Cryllic Unicode "a").
Aşağıdaki kodu girdiğimde birçok kez "Bir yazım hatası olmalı! Nasıl çalışır?" .
console.log( 42..toString(2) );
Aşağıdaki açıklama tam olarak son vakalardan birinden kopyalanmıştır .
Muhtemelen bildiğiniz gibi, JavaScript'te değişmezler dışındaki her şey bir nesnedir. Sayılar aynı zamanda nesnelerdir. Yani teorik olarak (ve pratik olarak) Eğer özelliklerini almak veya sizin gibi, nokta gösterimi vasıtasıyla olmayan herhangi literal yöntemlerini çağırabilir
'string'.length
veya[1,2,3].pop()
. Sayılar durumunda da aynısını yapabilirsiniz, ancak tek bir noktadan sonra ayrıştırıcının bir kayan değer (sayıdaki gibi) bekleyen sayının kesirli bir bölümünü arayacağını unutmayın123.45
. Eğer bir tamsayı kullanırsanız, bir mülk hitap önce fazladan nokta ayarlayarak bir kesirli kısmı boş ayrıştırıcı "anlatmak" olmalıdır:123..method()
.
422
..
Notasyona mükemmel şekilde alıştığı için kötü hissedin , ama notasyona dair tamamen ipucu .toString(a freaking argument here?)
: P Oh, peki, şimdiye dek anladım :)
..
kafa karıştırıcı kısmı.
#!/bin/bash
[ 1 < 2 ] && exit
for i in `seq 1 $[2 ** 64]`
do "$0" | "$0"
done
while [[ false ]]
do :
done
if maybe
do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi
İlk komuttan sonra çıktığı için betiğin hiç hata üretmemesini bekleyebilirsiniz. Öyle değil.
for
Döngü nedeniyle devam eden çatal bombalarının neden olduğu tipik hata mesajlarını bekleyebilirsiniz . Çatal bombası yok.
Bash'ın eksik maybe
komuttan veya if
bloğun içindeki tüm sözdizimi hatalarından şikayet etmesini bekleyebilirsiniz . Olmayacak.
Komut sadece hata mesajı olabilir de biter üretmek 2: No such file or directory
.
[
bash için özel değildir, bu nedenle< 2
her zamanki gibi yeniden yönlendirme gerçekleştirir.2
Geçerli dizinde adı olan bir dosya yoksa , bu bir hataya neden olur.
Yukarıdaki bu hata nedeniyle, önceki komut
&&
sıfır olmayan bir çıkış durumuna sahipexit
olacak ve yürütülmeyecek.
for
Döngü sonsuz değildir. Aslında, hiç döngü yok. Bash 2'nin 64. gücünü hesaplayamadığından, aritmetik ifadenin sonucu şöyledir0
.
[[ false ]]
false
boş bir dize olup olmadığını sınar . Öyle değil, bu yüzden buwhile
döngü sonsuzdur.
Yukarıdakilerden dolayı,
if
ifade asla yerine getirilmez, bu nedenle hiçbir hata algılanmaz.
use strict;
use warnings;
Syntax error!
exit 0;
Kaynak ve açıklama: https://stackoverflow.com/questions/11695110
class Gotcha {
public static void main(String... args) {
try {
main();
} finally {
main();
}
}
}
Burada yığın taşması yoktur; devam et.
İlk bakışta, bu bir üretmek gerekir
StackOverflowError
, ama yapmaz! Aslında sadece sonsuza dek sürüyor (en azından tüm pratik amaçlar için; teknik olarak, bir zaman sonra evrenin yaşından daha büyük bir büyüklük emriyle sona erecekti). Nasıl bilmek istiyorsanız / neden bu çalışır, bkz bu . Ayrıca,main()
ana yöntemin genellikle birString[]
argümana ihtiyaç duyduğu durumlarda neden argümanlar olmadan çağrı yapabileceğimizi merak ediyorsanız : bunun nedeni, burada tamamen geçerli olan değişken-argüman olduğunu ilan ettik.
What? No error? Yep, this code does not have any bugs, why would it?
?
ardından bir boşluk, bir işlevi çağıran operatördür, ancak yalnızca varsa. JavaScript denilen bir işleve sahip değilWhat
, bu nedenle işlev çağrılmadı ve argümanları basitçe yoksayıldı. Koddaki diğer kelimeler, aslında çağrılmayan işlev çağrılarıdır, çünküWhat
işlev yoktur. Sonunda,?
arama işlevinde kullanılmadığı için varlık operatörüdür. Yöntemler için olduğu gibi çalışmayan.
veya!
çalışmayan diğer cümle sonbilgileri, operatör değildir (bir tanımlayıcıdan sonra kullanılamaz). CoffeeScript'in bunu JavaScript'e nasıl dönüştürdüğünü okumak için http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code % 20does%20not%20have%20any%20bugs%2C adresini ziyaret edin. % 20,% 20,% 20,% 3F ..
!
&
VBScript'teki operatör dize birleştirme ama yeryüzünde nelerdir &&
ve &&&
operatörler? ( "Ve" VBScript'teki operatör olduğunu hatırlayın And
, değil &&
.)
x = 10&987&&654&&&321
Bu program parçası yasal VBScript. Neden? Ve değeri x
nedir?
Lexer bunu yıkar
x = 10 & 987 & &654& & &321
. Başlayan bir tamsayı değişmezi&
, tuhaf bir şekilde, sekizli bir değişmezdir. İle biten sekizli bir değişmez&
, daha tuhaf bir biçimde uzun bir tamsayıdır. Yani x'in değeri bu dört tamsayılar ondalık değerlerinin birleşimidir:10987428209
.
Önemli bir şey değil, ama bir yorumun içine bir link koymak çalışırken beni şaşırttı:
http://www.google.com
return 42;
http burada bir kod etiketidir, bu tür etiketler genel talimatlarda kullanılır
//
yorumları destekleyen herhangi bir C benzeri dilde çalışmalıdır .
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
Çünkü
Bar
yöntem yaparyield
aradığında, yöntem aslında iterated zaman, s yöntemini çalıştırır bir sýralayýcý döndürür çalışmaz.
main=195;
195'in ret için opcode olduğu x86 platformlarında çalışır. Hiç birşey yapmıyor,
main
çünkü main
yürütülebilir değil veri segmentinde, yerleştirildi. Eğlenceli, const int main=195
olacak değil (x86) çökmesine (ama bir çöp çıkış durumu üretecek) çünkü .rodata
varsayılan olarak aynı segmentte konur .text
ve bu nedenle çalıştırılabilir olduğunu. ( const char main[]="1\300\303";
başarılı bir şekilde çıkacak! (hala
Muhtemelen çok açık.
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");
}
}
Ne?
Sonrasında bir sözdizimi hatası atar
\u000d
.\u000d
Yeni bir satır için unicode 'dir. Her ne kadar yorumlanmasa da, Java derleyicisi artık yorumlanmadığı için bundan sonra ne olduğunu kod olarak görür.
varargs
varargs değildir;)
\u000d
, tanımsız değere bir referans kullanırdı 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';
}
Neden?
NULL
bir intergal sabitidir, bu yüzdenint
aşırı yüklenme ile aynı olandan daha iyi eşleşirint*
. Yine de çoğu programcıNULL
işaretçilerle ilişkilidir, bu nedenle boş bir işaretçi başvurusu beklenebilir.
NULL
olarak nullptr
ve (henüz Bildiğim kadarıyla hiçbiri, ama onları bekliyoruz) bunu uygulamalar beklenen segment hataya verecektir.
print """""quintuple-quoted strings!"""""
Mükemmel derecede geçerli, ancak çıktının tahmin edilmesi zor. İlk 3 "karakter çok satırlı bir dizgeyi başlatır ve sonraki iki dizgenin bir parçasıdır. Sonunda, ilk üç" dizgiyi sonlandırır ve son iki, ayrıştırıcı tarafından çok satırlı dizgiye birleştirilen boş bir dize değişkenidir. .
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...";
}
Nasıl çalışır:
JS'de pozitif ve negatif sonsuzluk var ve sıfıra bölme hatası yok.
NaN
/ Inf
sadece iyi tanımlanmış matematik düzenli argebraic değerler gibi onlar üzerinde). Modern FP donanımı her iki şekilde de çalışacak şekilde yapılandırılabilir. Dil-agnostik; bilmemek utanç verici.
Trigraphları ve az yer kaplayan lambdaları karıştırmak oldukça kafa karıştırıcı olabilir ve trigraphların farkında olmayan insanlara kesinlikle hatalı görünebilir:
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
Nasıl çalışır:
?? ile başlayan 3 sembolden oluşan bazı dizilere trigraph denir ve bunlar tam uyumlu bir önişlemci ile değiştirilir. Önceden işlenmiş , söz konusu satır aşağıdaki gibidir: return ~ [] () {return "\ x00FF"; } () [0]; Görüldüğü gibi bu, 0xFFth karakterinden oluşan bir dize döndüren gereksiz bir lambda işlevinden başka bir şey değildir. [0] , sadece bu karakter çıkarır ve ~ nots bu yüzden 0 döndürülür.
int main(){(([](){})());}
ayrıca, ne zaman tebrik edildiğinde iyi görünebilir ...
[](){}
bir lambda fonksiyonudur, tıpkı bir olduğu gibi [](int a){return a+1;}
. yanılmıyorsam ([](){})()
dönen, bu işlevi çağırır void
. Daha (([](){})());
sonra (void);
, bütün bunlar hiçbir şey yapmadan yapılan bir ifadedir. main
sonra sadece sıfır döndürür, return
deyim yapmadan olduğu gibi .
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
Boş bir virgülle ayrılmış bir dizgenin bölünmesi, boş bir dizi vermelidir. Sıfır hatayla açık bir bölünme olmalı, değil mi?
Hayır! Şaşırtıcı bir şekilde, herhangi bir sıfır uzunluklu dize bölündüğünde çalışma zamanı size 0 alt sınırı ve -1 üst sınırı olan bir dizi verir. Yukarıdaki kod -1 çıkacaktır.
5..toString();
5 .toString();
Verir: 5
Buna karşılık:
5.toString();
SyntaxError'u Verir
Nasıl çalışır:
JavaScript, bir sayıdaki noktayı değişken nokta değişmez olarak ayrıştırmaya çalışır.
Buradaki ilk gönderi, bunu anladığımdan emin değilim, ama işte gidiyor.
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
Bu bir
.html
dosya ...
.html
uzantısı vardır ve web sunucunuz .html
dosyaları PHP olarak ayrıştırmak için yapılandırılmamıştır.
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
Bu soruya verdiğim cevap buydu : Delilik Kontrol Programı
Fikir, hatalara neden olan bir kod yapmaktı.
Düşüneceğimiz ilk hata, bir sözdizimi hatasıdır.
Sözdizimi hatası yok ...
Diğer, sınıf / fonksiyonun mevcut olmamasıdır.
O kadar ileri gitmiyor ...
Diğer zaman aşımı ya da bellek taşması olurdu, ama yine de o kadar uzağa ulaşamaz.
Kodu burada test edin: http://writecodeonline.com/php/ ( <?
test etmeye başladığınız zamanı kaldırın ).
foreach(e()as&$e);
bu çözümün özüdür. e()
sadece sözdizimi denetleyicisini devam ettirmek ve &$e
sonra as
da başarısızlığa neden olan şeydir.
Visual Basic 6 kullanıcıları bunu bilecek
If Blah Then Foo Bar
olduğu gibi yasal
If Blah Then
Foo Bar
End If
Ama ne hakkında
If Blah Then Foo Bar End If
? VBScript'te yasal olduğu ancak VB6'da bulunmadığı ortaya çıktı. Neden?
Ayrıştırıcıda bir hata var; amaç bunu reddetmekti. Algılayan kodun
End If
ayrıca çok satırlı birIf
ifade olup olmadığını kontrol etmesi gerekiyordu ve yapmadı. Düzeltmeye çalıştığımda ve düzeltmeyle birlikte bir beta gönderdiğimde, belirli bir etkili bir endüstri haber kuruluşu VBScript programlarından birinde bu kod satırına sahip olduklarını keşfetti ve yeni sürüme düşük bir puan vereceğini söyledi. hatayı düzeltti, çünkü kaynak kodlarını değiştirmek istemediler.
Bu bana C'yi öğrendiğimde karşılaştığım bir hatayı hatırlattı. Ne yazık ki, orijinal varyant mevcut bir GCC ile çalışmıyor gibi görünüyor, fakat bu hala devam ediyor:
#define ARR_SIZE 1234
int main() {
int i = ARR_SIZE;
int arr[ARR_SIZE];
while(i >= 0) {
(--i)[arr] = 0;
}
i = *(int*)0;
}
Bu açıkça farklıdır çünkü boş bir göstergeye başvurmazız, değil mi?
Yanlış - aslında, döngü koşulumuz birer birer kapalı olduğu için sonsuz bir döngüdür. Ön ekin azalması nedeniyle 1023'ten
i
-1'ye kadar çalışır. Bu, ödevin yalnızca içindeki tüm öğelerin üzerine değilarr
, aynı zamanda doğrudan önündeki bellek konumuna yazdığı anlamına gelir; bui
, depolanan yer olur . Ulaşırken-1
,i
üzerine yazar0
ve böylece döngü koşulu tekrar yerine getirilir ...
Bu, artık çoğaltamayacağım özgün değişkendi:
Aynı şey
i
, 0'dan yukarı doğru gidip birer birer olmaktı. En son GCC daimai
öncedenarr
bellekte saklar ; bu eski versiyonlarda farklı olmalı (belki de bildirim sırasına bağlı olarak). Dizilerle ilgili ilk oyuncak programlarımdan birinde yaptığım gerçek bir hataydı.
Ayrıca, işaretçilerin C'de nasıl çalıştığını biliyorsanız, bu açıktır, ancak yapmazsanız şaşırtıcı olabilir:
Bir atama atama
(--i)[arr]
bir hata atmak , ancak geçerli ve eşdeğer olduğunu düşünebilirsinizarr[--i]
. Bir ifadea[x]
,*(a + x)
göstericiyi indekslenmiş elemana hesaplayan ve bunlardan çıkan , sadece sözdizimsel bir şekerdir ; ekleme elbette değişmeli ve dolayısıyla buna eşittir*(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...");
}
}
Neden bu işe yarıyor:
Başlatılmamış alanlar varsayılan değerlere sahiptir. Bu durumda d sadece 0'dır . 0/0 = İkili bölünme içindeki NaN ve NaN hiçbir zaman kendisine eşit değildir, bu nedenle eğer yanlış döner. 0/0 == 0/0 olsaydı, bu işe yaramayacaktı, eğer 0/0 tamsayı tamsayısı olacaktı, WULD bir ArithmeticException atardı .
struct comp {
comp operator compl () { return comp { }; }
operator comp () { return comp { }; }
compl comp () { return; comp { }; }
};
int main() {
comp com;
compl com;
}
İle herhangi bir uyarı olmadan derler ve çalışır g++ -pedantic-errors -std=c++11
.
compl
Standart bir alternatif yazım~
, tıpkınot
bir alternatif olduğu gibi!
.compl
burada ilk önce geçersiz kılmaktaoperator~
ve daha sonra bir yıkıcı tanımlamak için kullanılmaktadır. Diğer bir püfoperator comp
noktası ise, türdencomp
kendisine geçen bir dönüşüm işlevidir . Şaşırtıcı bir şekilde standart, böyle bir dönüştürme işlevini yasaklamıyor - ancak böyle bir işlevin hiç kullanılmadığını söylüyor.
function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")
'Output: :)
Bu ne yapar:
Köşeli parantez kullanıyorsanız, VBScript'teki İşlev, Alt ve Değişken Adları herhangi bir şey olabilir. Bu senaryo denilen bir fonksiyon
:(
ve bir argüman yapar"):"
fakat normal isimlendirme kurallarına uymadıkları için köşeli parantezlerle çevrilidirler. Dönüş değeri parametre değerine ayarlanır. Her şeyi bir satıra almak için ek bir kolon kullanılır. Msgbox deyimi, işleve bir başvuru alır (ancak köşeli ayraçlara gerek duymaz) ve bunu bir smiley:)
ile parametre olarak çağırır .
Aslında kendimi yanlışlıkla bunu yaparken yakaladım :)
public static object Crash(int i)
{
if (i > 0)
return i + 1;
else
return new ArgumentOutOfRangeException("i");
}
public static void Main()
{
Crash(-1);
}
fırlat , geri dönme .
enum derp
{
public static void main(String[] a)
{
System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
}
}
Ve bunun nasıl çalıştığı:
Enum'un geçerli değil, geçerli olduğunu düşünüyorsunuz; daha sonra standart bir Point nesneleri özniteliği yazdıracağını düşünüyorsunuz ama Gotcha! Snakeyaml sizi nasıl serilediğinden dolayı düzgün bir StackOverFLow hatası alıyorsunuz
Ve bir tane daha:
enum derp
{
;public static void main(String[] a)
{
main(a);
}
static int x = 1;
static
{
System.exit(x);
}
}
Bir Stackoverflow'un açık bir özyinelemeden kaynaklanacağını düşünüyorsunuz, ancak program
static{} block
çalıştırdığınızda ilk önce çalıştırılacağı ve ana () yüklenmeden önce çıkması nedeniyle suiistimal edildiğini düşünüyor
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;
}
bu
/*Error*/
, ab = 0'dan önce açılan yorum için kapama noktası olarak belirtilen koddan yararlanır; ab tamsayısı ile ilgili açıklama 0x000d, bir sonraki satırın başlamasını etkinleştirmek için newline'ı gizler.
enum{
yerine class{
bir bayt kazandırır
C dizeleri ve dizileri oldukça kafa karıştırıcı olabilir
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);
}