Ne? Hata yok? [kapalı]


197

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.


11
hmmmm .... bu bir zeka oyunu. +1
Tim Seguine

1
Keşke bulabilseydim ... "eğer eğer öyleyse sonra öyleyse = else = = eğer öyleyse başka ..." satırları boyunca bir ifade içeren eski bir PL / I örneği vardı. ? Ayrıca eğer / o / else anahtar kelimeleri ...) kullanılır: onun değişken adları gibi anahtar kelimeler ve C'ler benzer bir koşullu ifade vardı
keshlam

8
Beyin kodunu derlemeyecek gibi göründüğü için beynin bütün dilini öneririm .
Agi Hammerthief,

@ NigelNquande sadece aşina değilsen ...;)
Jwosty

Yanıtlar:


281

C ++

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 mainiyi tanımlanmış ve başarılı bir çalışma olduğunu belirten 0 dönüşüne eşdeğer olduğunu unutmayın.


7
İlk cevabın sadece yarasadan hemen kazandığını hissediyorum.
temporary_user_name

1
Aynı zamanda C99'da geçerlidir.
R. ..

1
-Wall

2
@ BЈовић Duvar her zaman her şey hakkında uyarı
atıyor

4
@Kiwy Sadece yukarıdaki gibi çöp kodu için uyarı atar. -Wall her şey için uyarı vermiyor.
BЈовић

86

Yakut

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.


5
Beni yakaladın. Hem Python hem Lua'yı daha önce yaptım ve şimdi de Ruby'den başlıyorum. Lua bunu kullanır.
Riking

7
Evrenin anlamı görecek bir şey değil mi?
user80551


77

C?

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ı.


21
Yani başka bir deyişle, hile yapmak?
Bay Lister

75
Hile, kod yarışması yarışmalarında normaldir. Biz buna yaratıcılık diyoruz. : P
Joe Z.

31
Ben buna hile yapıyorum, yaratıcılık değil. Çalıştığınız ortamı tanımlamanız gerekir, hatta bazı kodların hata verip vermeyeceğini bile düşünebilirsiniz. Aksi halde, size Malbolge olan hat sesini verebilirim ve size derler mi diye sorabilirim.
Tim S.

5
Sadece bir saniye dur ve gitmesi gerekiyordu 'hey sen yapabilirsiniz yapmak o?' :)
intx13

10
@JoeZ. Bu belki bazı durumlarda Perlde benziyor.
user80551

72

JavaScript

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 aaslında bir а(yani, Cryllic Unicode "a").


8
Bu numara, Unicode belirteci kabul eden herhangi bir dile uygulanabilir (örn. Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
Kullanıcı adınız örneklenen @ n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳,
TheDoctor

9
çok açık bir çözüm
thepirat000

6
Daha önce karşılaştığı herkes için çok açık. Çok sayıda yeniliğin ve "web uzmanı" nın sözde işe yarayacağına eminim.
TheBluefish

42
Açık? Yani değişken isimlerinize her zaman göründükleri yerine Unicode numaraları üzerinden mi bakıyorsunuz? Eğer "a" (ya da "а"?) Ararsanız ve beklediğinizi bulamazsanız fark edebilirsiniz, fakat sadece okurken bunu göremezsiniz (en azından burada gösterilen yazı tipinde).
Tim S.

70

JavaScript

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'.lengthveya [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ın 123.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().


18
Bir lua adamı olarak bekliyordum422
14'te

3
Bu kullanımı daha önce hiç görmedim, çok düzenli.
Nit

5
..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 :)
David Mulder

Bu çıktı ne? Ve neden ? Meraklıyım.
Nicolas Barbulesco

3
Tembeller için, argüman tabanı belirtir (bu yüzden bu ikili olarak 42 yazacaktır) ve bu kod için hiç önemli değil. ..kafa karıştırıcı kısmı.
Kat

63

darbe

#!/bin/bash

[ 1 < 2 ] && exit

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

while [[ false ]]
    do :
done

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

Sonuçlar

  • İlk komuttan sonra çıktığı için betiğin hiç hata üretmemesini bekleyebilirsiniz. Öyle değil.

  • forDöngü nedeniyle devam eden çatal bombalarının neden olduğu tipik hata mesajlarını bekleyebilirsiniz . Çatal bombası yok.

  • Bash'ın eksik maybekomuttan veya ifbloğ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.

açıklama

  • [bash için özel değildir, bu nedenle < 2her zamanki gibi yeniden yönlendirme gerçekleştirir. 2Geç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 sahip exitolacak ve yürütülmeyecek.

  • forDöngü sonsuz değildir. Aslında, hiç döngü yok. Bash 2'nin 64. gücünü hesaplayamadığından, aritmetik ifadenin sonucu şöyledir 0.

  • [[ false ]]falseboş bir dize olup olmadığını sınar . Öyle değil, bu yüzden bu whiledöngü sonsuzdur.

  • Yukarıdakilerden dolayı, ififade asla yerine getirilmez, bu nedenle hiçbir hata algılanmaz.


55

Perl

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

Kaynak ve açıklama: https://stackoverflow.com/questions/11695110


137
Perl programları genellikle hatalara benzer.
ugoren

1
@ugoren Sadece Perl hakkında az bilgisi olan kişiler tarafından yazıldığında ve okunduğunda.
TLP

8
@ Ugoren'ın yorumunun cevaptan iki kat daha fazla oyu olduğunu sevmelisin :)
yo

2
Bana Windows kabuğundaki numarayı hatırlatıyor: "Mutluysanız ve biliyorsanız, Sözdizimi Hatası!"
Jwosty

47

Java

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 bir String[]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.


3
Bağladığınız sorunun açıkladığı gibi, süresiz olarak değil, çok uzun bir süre boyunca devam ediyor.
Kevin

1
@Kevin Burada gereksiz yere bilgiçlik edemeyiz; "evrenin yaşından daha uzun", tüm pratik amaçlar için "sonsuza kadar" dır.
arshajii

8
"Burada hiçbir yığın taşması yok" diyorsunuz, aslında, sistem sürekli olarak yığın taşmaları atıyor ve sonunda bir yığın taşması istisnası atıyor. (Bahsettiğiniz gibi, sonunda çok çok uzun bir zaman olabilir) Ve bu, yığın derinliğine bağlıdır. Daha küçük bir VM'de veya gömülü sistemde yığın derinliği çok daha küçük olabilir.
McKay

@McKay Bu ifade, kelimenin tam anlamıyla alınmadığı açık bir şekilde anlaşılabilir bir satır. OP, bir hata üretmesi gerektiğini belirten bir program istiyor, ancak bir hata oluşturmuyor. Genel durumda, yukarıdaki cevap bu şartı yerine getirir. Tabii ki, olmadığı yerde belirsiz bir durum ortaya çıkarabiliriz, ancak bu cevabı geçersiz kılmaz. İnşallah oyunuzu tekrar gözden geçirirsiniz.
arshajii

3
Bu arada @McKay, bu yığın büyüklüğü kabul olduğu (normal ~ 10,000 karşı, örneğin, 100), küçük ve olabilir yine saniyede 10,000,000 çağrı yapmak. Sonra toplam çalışma süresi 4,019,693,684,133,147 yıl olarak ortaya çıkar - hala evrenin yaşından daha büyük büyüklüklerdedir.
arshajii

42

CoffeeScript

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ğil What, 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ü Whatiş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 ..!


36

VBScript

&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 xnedir?

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.


8
Bu sadece ... vay.
primo

27

Objective-C

Ö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


8
Bu, //yorumları destekleyen herhangi bir C benzeri dilde çalışmalıdır .
Ilmari Karonen

Evet, muhtemelen gönderim sırasında emin değildim
Piotr

14
Yine de kapsam başına protokol başına bir URL sınırlayın.
Ben Voigt

1
Yine aynı kapsamda https: // kullanabilirsiniz.
Florian F

25

C #

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

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

Çünkü Baryöntem yapar yieldaradığında, yöntem aslında iterated zaman, s yöntemini çalıştırır bir sýralayýcý döndürür çalışmaz.


Sonunda ... İşte FOO ve BAR :)
VVK

1
Foo ve bar bunun içindir;) aslında önemli olmayan şeylerin isimleri.
McKay

22

C

main=195;

195'in ret için opcode olduğu x86 platformlarında çalışır. Hiç birşey yapmıyor,


Ret için opcode 195, 193 değil, değil mi?
Dennis

Benim için çalışmıyor. Bunun 195 adresindeki kodu çalıştırmasını
beklerdim.

Tbanks @Dennis, kod doğruydu, açıklama yanlıştı.
ugoren

3
(Dahil herhangi platformunda çağdaş sayfalar da çalıştırılabilir olmadan okunabilir olabilir x86), bu girişte kilitlenmesine mainçünkü mainyürütülebilir değil veri segmentinde, yerleştirildi. Eğlenceli, const int main=195olacak değil (x86) çökmesine (ama bir çöp çıkış durumu üretecek) çünkü .rodatavarsayılan olarak aynı segmentte konur .textve bu nedenle çalıştırılabilir olduğunu. ( const char main[]="1\300\303";başarılı bir şekilde çıkacak! (hala
x86'da

2
64bit bir makinedeyim (bunun bir şeyi değiştirip değiştirmeyeceğini bilmiyorum) ve main = 195 bir segfault veriyor, ancak const int main = 195; Eserleri.
w4etwetewtwet

21

Java

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. \u000dYeni 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.


11
sizin varargsvarargs değildir;)
Navin

Soru, "başarısız gibi görünen, ancak olmayan", "başarısız gibi görünen, ancak farklı şekilde yapan kod" du. İstisna yerine sözdizimi hatası olması hala bir hatadır.
Nzall

19
Bence asıl soruyu tekrar okumalısınız: "veya ilgisiz başka bir hata üretiyor."
Tom Verelst

Aslında, olmadan \u000d, tanımsız değere bir referans kullanırdı a.
LegionMammal978 21:15

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';
}

Neden?

NULLbir intergal sabitidir, bu yüzden intaşırı yüklenme ile aynı olandan daha iyi eşleşir int*. Yine de çoğu programcı NULLişaretçilerle ilişkilidir, bu nedenle boş bir işaretçi başvurusu beklenebilir.


11
Neyse ki, C ++ 11 uygulamaları tanımlamanızı sağlar NULLolarak nullptrve (henüz Bildiğim kadarıyla hiçbiri, ama onları bekliyoruz) bunu uygulamalar beklenen segment hataya verecektir.
HVD

16

piton

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. .


20
Sadece bir bonus: 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...";
}

Nasıl çalışır:

JS'de pozitif ve negatif sonsuzluk var ve sıfıra bölme hatası yok.


2
Siz de NaN ile bazı püf noktaları yapabilmelisiniz ...
intx13 20.01

8
meh, bu yüzer ile herhangi bir dilde olur.
Navin

3
@Navin: Yüzdeleri sıfıra bölmenin hataya neden olmadığı herhangi bir dilde.
nwk

2
@nwk Şamandıralar için IEEE standardı, sıfıra bölünmenin bir inf olması gerektiğini söylüyor. Bunu değiştiren dilleri bilmiyorum.
Navin

1
IEEE 754 iki model belirtir NaN / Inf sinyal (sıfır bölme -1 gelen kare kökü, taşma / taşma vb FP durumlar yükseltmek) ve dışı sinyal davranır ( NaN/ Infsadece 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.
ulidtko

14

C ++

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.


12
Geçerli bir C ++ programı int main(){(([](){})());}ayrıca, ne zaman tebrik edildiğinde iyi görünebilir ...
Angew

1
Bu bile ne yapar?
Joe Z.

1
@Joe Z [](){}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. mainsonra sadece sıfır döndürür, returndeyim yapmadan olduğu gibi .
saat

13

VBA / VB6

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.


@minitech Aslında, boş bir diziyi UBound'a iletirseniz, size aralık dışında bir Abonelik hatası verir.
Komintern

… iyi. Onu geri alırım. VBA = /
Ry -

1
@minitech Yep. Bunun, Split'in VB6'daki orijinal uygulamasında bir hata olduğunu anladım. .NET'te kasten "eklediler" (veya belki de daha iyi belgelendiler), bu hack'ten yararlanan tüm VB6 kodlarıyla geriye dönük uyumluluğu korumak için -1 UBound döndüren boş dizilerin davranışı. Boş bir dizgeyi bölmek, bu diziyi yerel olarak VBA / VB6'da Windows API çağrıları olmadan almanın tek yoludur.
Comintern

12

JavaScript

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.


13
Benden bir saat sonra yaptığım gibi aynı davayı nasıl yolladın ?
Ziyaret

1
Hey Vision, üzgünüm ama cevabını kontrol etmedim. Ayrıca boşluk içeren bir dava ekledim. Bunu bir kez javascript bahçesinde başka bir şey okumam.
Sumeet Kashyap

1
Sumeet, üzülme. Cevabınız @VisioN tarafından verilen cevaptan daha güzel - ve çok daha net -.
Nicolas Barbulesco

12

HTML

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 .htmldosya ...


9
Yani püf noktası sadece PHP bloğunu çalıştırmayacağıdır, çünkü dosya .htmluzantısı vardır ve web sunucunuz .htmldosyaları PHP olarak ayrıştırmak için yapılandırılmamıştır.
Görüşme

5
Evet. Bu hile yapmak mı? @VisioN
Albzi

2
Bunun aldatma olduğuna eminim. En altında en üstte kalın olan "HTML" yazın.
Navin

Güzel ! :-) Hile bana çalıştı.
Nicolas Barbulesco

1
Hangi dilde yazıldığını netleştirmek için düzenleme yaptım
vijrox

9

PHP (40 bayt)

<?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 ).


3
Bu bir popülerlik yarışması. Baytları kurtarmak için ur kodunu sıkıştırmanıza gerek yok. Sadece daha iyi okunabilmesi için yeniden biçimlendirin;)
Songo

Daha sonra okunabilir bir sürüm ekleyeceğim. Aynı cevabı kullandım ve hiçbir şekilde düzenlemedi.
Ismael Miguel

foreach(e()as&$e);bu çözümün özüdür. e()sadece sözdizimi denetleyicisini devam ettirmek ve &$esonra asda başarısızlığa neden olan şeydir.
Oluşturucu,

Aslında, her şey önemli bir rol oynamaktadır.
Ismael Miguel

9

VBScript

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 Ifayrıca çok satırlı bir Ififade 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.


VB6'da geçerli olmayan VBS kodunu yazmanıza izin vermenin yanı sıra, hatayı düzeltmeden bırakmanın herhangi bir dezavantajı var mı?
Gabe

1
@Gabe: Hayır, VBScript kodunu VB'ye aktarmanın zor olmasından başka bir dezavantaj yok.
Eric Lippert

1
Bir isim ! Bu haber organizasyonu kim?
Nicolas Barbulesco

9

C

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ğil arr, aynı zamanda doğrudan önündeki bellek konumuna yazdığı anlamına gelir; bu i, depolanan yer olur . Ulaşırken -1, iüzerine yazar 0ve 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 daima iönceden arrbellekte 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üşünebilirsiniz arr[--i]. Bir ifade a[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).


1
Görebildiğim kadarıyla döngü gövdesi asla çalıştırılmamalıdır (çünkü 1234 <= 0 yanlış olarak değerlendirilir). Muhtemelen "> =" yazmayı mı istediniz?
celtschk

1
@celtschk evet, bu bir yazım hatası oldu. Fark ettiğiniz için teşekkürler!
l4mpi

Bu bellek hizalaması gerçekten belirtilmiş mi, yoksa sadece bazı derleyicilerde bu şekilde mi uygulanıyor?
Paŭlo Ebermann

9

Java

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ı .


8

C ++ 11

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.

complStandart bir alternatif yazım ~, tıpkı notbir alternatif olduğu gibi !. complburada ilk önce geçersiz kılmakta operator~ve daha sonra bir yıkıcı tanımlamak için kullanılmaktadır. Diğer bir püf operator compnoktası ise, türden compkendisine 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.


8

VBScript

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 .


1
O kadar çok frowny yüzleri :(
Joe Z.

8

C #

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 .


Haha, siteye hoş geldin! İlk yazı olarak bunun cesareti için Kudos. :)
Jonathan Van Matre

7

Java

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.


1
Şu an yapamam, ama eğer mümkünse, bunu yeniden biçimlendirmek güzel olurdu. Olduğu gibi okumak biraz zor ...: P
Jwosty

daha belirgin hale getirdi; ve spoiler etiketlerinin, hilelerin ilk
başlarda

2
Bekle, yani ilki, aslında, bir hata üretiyor? Sorunun sorduğu şeyin tam tersi bu. Ve neden sadece ikinci System.exit (1) değil?
Riking

3
Hiçbir java programcısı, ikinci snippet'te bir yığın taşması bekleyemez. Üzgünüm, bu çok açık.
Tobias

1
@VVK codegolfing kullanma alışkanlığı enum{yerine class{bir bayt kazandırır
masterX244

6

C

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

9
okumak zor, ama insanların bundan ne tür bir hata beklediğini bilmiyorum
Bryan Chen

3
Ben sadece insanlara geçerli fakat sıradışı gösterimlere hatırlatmak istedim - istediğini yap. Bunun geçerli olduğunu söylemeden önce kesinlikle üç kez bakardım. Öncelikle, 5 [string] gibi ifadeler sıradan bir kodlayıcı tarafından iyi bilinmez ve dizi indekslemenin mantığına meydan okur. İkincisi, '' + string, 2 dizge eklemeye benziyor, ancak yanlış fiyat teklifi veriyor. Üçüncüsü, & i ++ bir tamsayı adresi gibi görünüyor (ancak önceliği bununla ilgileniyor). Son olarak, değişmez dizginin ötesine yazıyoruz (ancak daha büyük destek arabelleğinin ötesinde değil).
orion

Çok kötü görünmüyor Sadece biraz C ++ kodladım, ancak bunu çözebilirim.
Navin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.