Какая? Нет ошибки? [закрыто]

196

Ваша задача проста. Напишите программу, которая, очевидно, должна выдавать ошибку на первый взгляд либо при компиляции, либо при запуске, но либо не дает, либо выдает какую-то другую несвязанную ошибку. Это конкурс популярности, так что будьте креативны.

Jwosty
источник
11
хмммм .... это головоломка. +1
Тим Сегин
1
Хотел бы я найти это ... был старый пример PL / I, который включал в себя утверждение в духе «если, если, если =, тогда тогда = еще, еще, еще, если тогда еще ...» (PL /, я позволил использовать его ключевые слова были именами переменных и имели условное выражение, аналогичное C: ?, в котором также использовались ключевые слова if / then / else ...)
keshlam
8
Я предлагаю весь язык мозгового потрясения, потому что код BF выглядит так, как будто он не компилируется.
Agi Hammerthief
@NigelNquande, только если вы не знакомы с ним ...;)
Jwosty

Ответы:

280

C ++

Убедитесь, что вы компилируете следующий код в стандартном режиме соответствия (например, для g ++ используйте флаг -ansi):

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

Как это устроено:

?? / - это последовательность триграфа, которая переводится в обратную косую черту, которая экранирует следующую новую строку, поэтому следующая строка все еще является частью комментария и, следовательно, не генерирует синтаксическую ошибку. Обратите внимание, что в C ++ пропуск возврата in mainчетко определен и эквивалентен возврату 0, что указывает на успешный запуск.

celtschk
источник
7
Я чувствую, что первый ответ просто инста - выиграл это сразу.
временное_пользовательское имя
1
Это также действует в C99.
R ..
1
есть предупреждения с -Wall
BЈовић
2
@ BЈовић Стена всегда выдает предупреждение обо всем
Kiwy
4
@Kiwy Выдает предупреждение только для мусорного кода, как указано выше. Стена не бросает предупреждения за все.
BЈовић
86

Рубин

Всегда фанат этого.

x = x

Нет NameError. х сейчас 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 

Печатает «здесь ничего не видно».

Это Эльсиф , а не иначе . (и это, конечно, не elif - горе заблудшему программисту на python (мне)!) Так что для интерпретатора elseif выглядит как обычный вызов метода, и, поскольку мы не вводим блок x <0, мы переходим непосредственно к else и не выдвигайте исключения. Эта ошибка невероятно очевидна в любой среде с подсветкой синтаксиса, к счастью (?) Код гольф не является такой средой.

roippi
источник
5
Ты поймал меня. Я делал и Python и Lua раньше, а теперь начинаю на Ruby. Луа использует это.
Riking
7
Смысл вселенной ничего не видно?
user80551
1
destroyallsoftware.com/talks/wat
Якоб Weisblat
77

C?

Довольно нормальный код здесь ...

void main() = main--;

Это Haskell, а не C. Он определяет функцию с именем "void", которая принимает два аргумента. Первый называется «main», а если второй (без имени) является пустым кортежем, он возвращает переменную «main». «-» начинает комментарий в Haskell, поэтому «;» закомментировано.

intx13
источник
21
Другими словами, это обман?
Мистер Листер
75
Обман - это нормально в соревнованиях по коду. Мы называем это творчеством. : P
Джо З.
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 "а").

Дверная ручка
источник
8
Этот прием можно применить к любым языкам, которые принимают токен Unicode (например, Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, примером может служить ваше имя пользователя
TheDoctor
9
слишком очевидное решение
thepirat000
6
слишком очевидно для тех, кто сталкивался с этим раньше. Я уверен, что многие новички и так называемые "веб-эксперты" могут быть запутаны этим.
Thebluefish
42
Очевидные? Таким образом, вы всегда смотрите на имена переменных через их номера Unicode вместо того, как они выглядят? Вы можете заметить это, если вы ищете «а» (или «а»?) И не можете найти то, что ожидаете, но когда просто читаете, вы не видите его (по крайней мере, шрифтом, показанным здесь).
Тим С.
70

JavaScript

Когда я предоставлял следующий код, мне много раз говорили: «Это должно быть опечатка! Как это может работать?» ,

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

Описание ниже было скопировано именно с одного из последних случаев .

Как вы, наверное, знаете, в JavaScript все, кроме литералов, является объектом. Числа также являются объектами. Таким образом, теоретически (и практически) вы можете получить свойства или вызвать методы любого не-литерального типа с помощью точечной нотации, как вы это делаете 'string'.lengthили [1,2,3].pop(). В случае чисел вы можете сделать то же самое, но вы должны иметь в виду, что после одной точки парсер будет искать дробную часть числа, ожидающего значение с плавающей запятой (как в 123.45). Если вы используете целое число , вы должны «сказать» парсеру , что дробная часть пуста, установив дополнительную точку перед адресацию свойства: 123..method().

зрение
источник
18
Как парень 422
Луа
3
Не видел такого использования раньше, очень аккуратно.
Nit
5
Чувствую себя плохо из-за того, что отлично привык к ..обозначениям, но совершенно ничего не понимаю по поводу .toString(a freaking argument here?)обозначений: P Ну, ладно, уже понял это :)
Дэвид Малдер
Что это вывод? И почему ? Я любопытный.
Николас Барбулеско
3
Для ленивых аргумент задает основание (так что это выведет 42 в двоичном виде), и это совсем не важно для этого кода. ..это запутанная часть.
Kat
62

удар

#!/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цикла. Там нет вилочной бомбы.

  • Вы могли бы ожидать, что bash будет жаловаться на отсутствующую maybeкоманду или целую кучу синтаксических ошибок внутри ifблока. Не будет

  • Единственное сообщение об ошибке, которое может выдать скрипт, заканчивается 2: No such file or directory.

объяснение

  • [не является особенным для bash, поэтому < 2выполняет, как обычно, перенаправление. Если 2в текущем каталоге нет файла с именем , это вызовет ошибку.

  • В связи с указанной выше ошибкой команда before &&будет иметь ненулевой статус выхода и exitне будет выполнена.

  • forЦикл не является бесконечным. На самом деле, петли нет вообще. Поскольку bash не может вычислить 64-ю степень 2, результатом арифметического выражения будет 0.

  • [[ false ]]проверяет, falseявляется ли пустая строка. Это не так, поэтому этот whileцикл бесконечен.

  • Из-за вышеизложенного ifоператор никогда не выполняется, поэтому ошибки не обнаруживаются.

Деннис
источник
55

Perl

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

Источник и объяснение: https://stackoverflow.com/questions/11695110

чернь
источник
137
Программы на Perl обычно выглядят как ошибки.
Угорен
1
@ugoren Только когда пишут и читают те, кто мало знает о Perl.
TLP
8
Вы должны любить , что @ ugoren Замечание имеет в два раза больше upvotes как ответ :)
йо»
2
Напоминает мне уловку оболочки Windows: «Если вы счастливы и знаете это, синтаксическая ошибка!»
Jwosty
47

Ява

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

Здесь нет переполнения стека; двигаться вперед.

На первый взгляд, это должно произойти StackOverflowError, но это не так! На самом деле он работает вечно (по крайней мере, для всех практических целей; технически он закончился бы через некоторое время на много порядков дольше, чем возраст вселенной). Если вы хотите знать, как / почему это работает, посмотрите это . Кроме того, если вам интересно, почему мы можем вызывать main()без аргументов, когда основной метод обычно нуждается в String[]аргументе: это потому, что мы объявили его как переменный-аргумент, что совершенно правильно.

arshajii
источник
3
Как объясняет вопрос, который вы связали, он работает не бесконечно, а очень долго.
Кевин
1
@Kevin Давайте не будем излишне педантичными здесь; «дольше, чем возраст вселенной» для всех практических целей «навсегда».
Аршаджи
8
Вы говорите «Здесь нет переполнений стека», когда на самом деле система постоянно выбрасывает переполнения стека и в конечном итоге выдает исключение переполнения стека. (как вы упоминаете, в конечном итоге это может занять очень очень много времени) И это зависит от глубины стека. На меньшей виртуальной машине или встроенной системе глубина стека может быть намного меньше.
МакКей,
@MkKay Это утверждение - явно пустая строка, которую не следует понимать буквально. ОП запрашивает программу, которая выглядит так, как будто она выдаст ошибку, но не делает этого. В общем случае ответ выше удовлетворяет этому требованию. Конечно, мы можем придумать непонятную ситуацию, где это не так, но это не лишает законной силы ответ. Я надеюсь, что вы пересмотрите свое отрицательное мнение.
Аршаджи
3
@McKay Кстати, предположим , что размер стека является небольшой (например , 100 , в отличие от нормальной ~ 10000), и мы можем еще сделать 10000000 звонков в секунду. Тогда общее время пробега составит 4 019 693 684 133 147 лет - все еще на много порядков больше, чем возраст Вселенной.
Аршаджи
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%20this%20code%20does%20not%20have%20any%20bugs%2C % 20 почему% 20%% 20% 3F .

Конрад Боровски
источник
36

VBScript

&Оператор VBScript является конкатенация , но то , что на земле являются &&и &&&операторы? (Напомним, что оператор «и» в VBScript есть And, а не &&.)

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

Этот фрагмент программы является легальным VBScript. Почему? И какова стоимость x?

Лексер ломает это как x = 10 & 987 & &654& & &321. Целочисленный литерал, который начинается с, &является, как ни странно, восьмеричным литералом. Восьмеричный литерал, который заканчивается на, &является еще более странным, длинным целым числом. Таким образом, значение х является конкатенация десятичных значений этих четырех чисел: 10987428209.

Эрик Липперт
источник
8
Это просто ... вау.
Прим
27

Objective-C

Ничего страшного, но это удивило меня, когда я пытался вставить ссылку в комментарии:

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

http здесь кодовая метка, такие метки используются в инструкциях goto

Петр
источник
8
Это должно работать на любом C-подобном языке, который поддерживает //комментарии.
Ильмари Каронен,
Да, наверное, я просто не был уверен при публикации
Петр
14
Ограничьте один URL на протокол для каждой области.
Бен Фойгт
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 запускает метод.

Маккей
источник
Наконец-то ... Вот ФУ и БАР :)
ВВК
1
Вот для чего foo и bar;) названия вещей, которые на самом деле не имеют значения.
МакКей,
22

С

main=195;

Работает на платформах x86, где 195 - это код операции для ret. Ничего не делает,

ugoren
источник
Код операции для ret это 195, а не 193, верно?
Деннис
Не работает для меня Я ожидаю, что это выполнит код по адресу 195.
nwellnhof
Tbanks @Dennis, код правильный, объяснение неверное.
Угорен
3
На любой платформе (включая современную x86), где страницы могут быть читаемыми, а также не исполняемыми, это может привести к сбою при входе в систему, mainпоскольку mainона была помещена в сегмент данных, который не является исполняемым. Забавно, но неconst int main=195 произойдет сбой (на x86) (но будет выдан статус выхода мусора), потому что по умолчанию он помещается в тот же сегмент, что и исполняемый. ( .rodata.textconst char main[]="1\300\303";
успешно завершится
2
Я на 64-битной машине (я не знаю, изменит ли это что-нибудь), и main = 195 дает ошибку по умолчанию, но 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это юникод для новой строки. Несмотря на то, что это закомментировано, компилятор Java обрабатывает то, что следует за этим, как код, так как это больше не закомментировано.

Том Верелст
источник
11
Вы varargsне varargs;)
Navin
Вопрос был в том, что «код выглядит так, как будто он терпит неудачу, но не работает», а не «код, который выглядит так, как будто он терпит неудачу, но делает это по-другому». Наличие синтаксической ошибки вместо исключения по-прежнему является ошибкой.
Nzall
19
Я думаю, что вы должны прочитать исходный вопрос еще раз: «или вызывает какую-то другую несвязанную ошибку».
Том Верелст
На самом деле, без \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ассоциируют с указателями, поэтому можно ожидать разыменования нулевого указателя.

Angew
источник
11
К счастью, C ++ 11 позволяет реализациям определять NULLкак nullptr, а реализации, которые делают это (пока что я не знаю, но я ожидаю их), приведут к ожидаемой ошибке сегментации.
HVD
16

питон

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

Совершенно верно, но на выходе сложно угадать. Первые 3 "символа начинают многострочную строку, а следующие два являются частью строки. В конце, первые три символа заканчивают строку, а последние два являются пустым строковым литералом, который парсер объединяет в многострочную строку. ,

Fraxtil
источник
20
Просто бонус: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Конрад Боровски
15

JavaScript

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

Как это устроено:

В JS есть положительная и отрицательная бесконечность, и нет ошибки для деления на ноль.

temporary_user_name
источник
2
Вы должны быть в состоянии сделать некоторые трюки и с NaN ...
intx13
8
Мех, это происходит на любом языке с поплавками.
Навин
3
@Navin: на любом языке с плавающей точкой, где деление на ноль не вызывает ошибку.
NWK
2
@nwk Стандарт IEEE для чисел с плавающей точкой говорит, что деление на ноль должно быть inf. Я не знаю ни одного языка, который бы это изменил.
Навин
1
IEEE 754 определяет две модели: сигнализация NaN / Inf (которая порождает исключения при делении на ноль FP, квадратный корень из -1, недополнение / переполнение и т. Д.) И не сигнализация (которая обрабатывает NaN/ Infточно так же, как обычные алгебраические значения с четко определенной математикой на них). Современное аппаратное обеспечение FP может быть настроено для работы в обоих направлениях. Язык агностик; Стыд не знать.
ulidtko
14

C ++

Смешение триграфов и незаполненных лямбд может быть довольно запутанным и определенно выглядит ошибочно для людей, которые не знают триграфов:

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

Как это устроено:

Некоторые последовательности, состоящие из 3 символов, начинающихся с ??, называются триграфами и будут заменены полностью совместимым препроцессором. Предварительно обработанная строка выглядит следующим образом: return ~ [] () {return "\ x00FF"; } () [0]; Как видите, это не что иное, как лишняя лямбда-функция, возвращающая строку, состоящую из символа 0xFFth. [0] просто извлекает этот символ и ~ НОТы его, так что 0 возвращается.

AVOX
источник
12
Действительная программа на C ++ int main(){(([](){})());}может также хорошо выглядеть, если ее засекретить ...
Angew
1
Что этот вообще делает?
Джо З.
1
@Joe Z [](){}- это лямбда-функция, как и [](int a){return a+1;}одна. ([](){})()вызывает эту функцию, возвращая, voidесли я не ошибаюсь. Тогда все (([](){})());сводится к тому (void);, что утверждение ничего не делает. mainзатем просто возвращает ноль, как это должно быть без returnзаявления.
Томсминг
13

VBA / VB6

Private Sub DivByZero()

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

    Debug.Print 1 / UBound(x)

End Sub

Разделение пустой строки, разделенной запятыми, должно дать пустой массив. Должно быть очевидное деление на ноль ошибок, верно?

Нет. Удивительно, но когда любая строка нулевой длины разделяется, среда выполнения выдает массив с нижней границей 0 и верхней границей -1. Код выше выведет -1.

Коминтерн
источник
@minitech На самом деле, если вы передадите пустой массив в UBound, он выдаст вам индекс из-за ошибки диапазона.
Коминтерн,
… Что ж. Я забираю это обратно. VBA = /
Ry-
1
@minitech Да. Я понимаю, что это была ошибка в оригинальной реализации Split в VB6. В .NET они намеренно «добавили» (или, может быть, документировано - это лучшее слово) поведение для пустых массивов, возвращающих UBound, равный -1, чтобы поддерживать обратную совместимость со всем кодом VB6, который воспользовался этим хаком. Разделение пустой строки - это единственный способ получить этот массив в VBA / VB6 без вызовов API Windows.
Коминтерн
12

Javascript

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

Дает: 5

В то время как:

5.toString();

Дает синтаксическую ошибку

Как это устроено:

JavaScript пытается разобрать точку на числе как литерал с плавающей точкой

Сумит Кашьяп
источник
13
Как так получилось, что вы опубликовали точно такой же случай, как и я через час после меня?
VisioN
1
Эй, Видение, извини, но я не проверил твой ответ. Я также добавил случай с пробелом. Я прочитал это однажды в саду javascript больше ничего.
Сумеет Кашьяп
1
Сумит, не извиняйся. Ваш ответ лучше - и намного понятнее - чем ответ @VisioN.
Николас Барбулеско
12

HTML

Первый пост здесь, я не уверен, получаю это или нет, но здесь идет.

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

Это .htmlфайл ...

Albzi
источник
9
Итак, хитрость в том, что он не будет выполнять блок PHP, потому что файл имеет .htmlрасширение, а ваш веб-сервер не настроен на синтаксический анализ .htmlфайлов как PHP?
VisioN
5
Да. Это обман? @VisioN
Альбзи
2
Я уверен, что это обман. По крайней мере, напишите «HTML» жирным шрифтом вверху.
Навин
Приятно ! :-) Трюк сработал на мне.
Николас Барбулеско
1
Я отредактировал, чтобы было ясно, на каком языке это написано
vijrox
9

PHP (40 байт)

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

Это был ответ, который я дал в этом вопросе: Insanity Check Program

Идея заключалась в том, чтобы сделать код, который выдает ошибки.

Первая ошибка, о которой мы подумаем, это синтаксическая ошибка.

Нет синтаксических ошибок ...

Другое было бы, что класс / функция не существует.

Это не так далеко ...

Другим будет тайм-аут или переполнение памяти, но, опять же, это не так далеко ...

Проверьте код здесь: http://writecodeonline.com/php/ (удалите <?в начале, чтобы проверить).

Исмаэль Мигель
источник
3
Это конкурс популярности. Не нужно теснить свой код, чтобы сохранить байты. Просто переформатируйте его для лучшей читаемости;)
Songo
Я добавлю читаемую версию позже. Я использовал тот же самый точный ответ и не редактировал его вообще.
Исмаэль Мигель,
foreach(e()as&$e);является ядром этого решения. e()просто для поддержания проверки синтаксиса и &$eпосле того as, что является причиной сбоя.
TheConstructor
На самом деле, все играют важную роль.
Исмаэль Мигель
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. Почему?

Это ошибка в парсере; Намерение было отклонить это. Код, который обнаруживает, End Ifдолжен был также проверять, был ли это многострочный Ifоператор, а это не так. Когда я попытался исправить это и разослал бета-версию с исправлением, одна влиятельная отраслевая новостная организация обнаружила, что у них есть эта строка кода в одной из своих программ на VBScript, и сказала, что даст новой версии низкий рейтинг, если мы не исправил ошибку, потому что они не хотели менять свой исходный код.

Эрик Липперт
источник
Есть ли какой-то недостаток в том, чтобы оставить ошибку не исправленной, кроме того, что она позволяет вам писать код VBS, который недопустим в VB6?
Гейб
1
@Gabe: Нет, нет недостатка, кроме как труднее перенести код VBScript на VB.
Эрик Липперт
1
Имя ! Кто эта новостная организация?
Николас Барбулеско
9

С

Это напомнило мне об ошибке, с которой я столкнулся, когда узнал 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работает с 1023 до -1. Это означает, что присвоение перезаписывает не только все элементы arr, но также и область памяти непосредственно перед ним - что, как оказалось, является местом, где iхранится. Достигнув -1, iпереписывает себя 0и , таким образом , условие цикла выполняется снова ...

Это был оригинальный вариант I, который я больше не могу воспроизвести:

То же самое сработало с iподъемом вверх от 0 и отключением на единицу. Последний GCC всегда хранится iраньше arrв памяти; это должно было отличаться в старых версиях (возможно, в зависимости от порядка объявления). Это была настоящая ошибка, которую я произвел в одной из моих первых игрушечных программ, работающих с массивами.

Кроме того, это очевидно, если вы знаете, как работают указатели в C, но может удивить, если вы этого не сделаете:

Вы можете подумать, что присваивание для (--i)[arr]бросает ошибку, но это допустимо и эквивалентно arr[--i]. Выражение a[x]является просто синтаксическим сахаром, для *(a + x)которого вычисляется и разыменовывается указатель на индексированный элемент; дополнение, конечно, коммутативно и, следовательно, эквивалентно *(x + a).

l4mpi
источник
1
Насколько я вижу, тело цикла никогда не должно выполняться (потому что 1234 <= 0 оценивается как ложное). Возможно, вы хотели написать "> ="?
celtschk
1
@celtschk Да, это была опечатка. Спасибо, что заметили!
14
Это выравнивание памяти действительно задано или просто реализовано таким образом в некоторых компиляторах?
Паŭло Эберманн
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 = NaN в двойном делении, и NaN никогда не равняется себе, поэтому if возвращает false. Обратите внимание, что это не сработало бы, если бы у вас было 0/0 == 0/0 , так как at было бы целочисленным делением 0/0, которое БЫЛО выдало бы исключение ArithmeticException .

durron597
источник
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это альтернатива для !. complиспользуется здесь, чтобы сначала переопределить, operator~а затем определить деструктор. Еще одна хитрость заключается в том, что operator compэто функция преобразования из типа compв себя. Удивительно, но стандарт не запрещает такую ​​функцию преобразования, но он говорит, что такая функция никогда не используется.

хань
источник
8

VBScript

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

'Output: :)

Что оно делает:

Имена функций, вложенных и переменных в VBScript могут быть любыми, если вы используете квадратные скобки. Этот скрипт создает вызываемую функцию :(и один аргумент, "):"но поскольку они не соответствуют нормальному соглашению об именах, они заключены в квадратные скобки. Возвращаемое значение устанавливается равным значению параметра. Дополнительное двоеточие используется, чтобы получить все на одной строке. Оператор Msgbox получает ссылку на функцию (но не нуждается в скобках) и вызывает ее со смайликом в :)качестве параметра.

AutomatedChaos
источник
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);
}

брось , не верни .

привидение
источник
Хаха, добро пожаловать на сайт! Слава за храбрость этого в качестве первого поста. :)
Джонатан Ван Матр
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будет выполняться первым и из-за того, что он завершится до загрузки main ()

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 скрывает символ новой строки, чтобы активировать комментарий следующей строки

masterX244
источник
1
Я не могу сейчас, но было бы неплохо, если бы вы переформатировали это, если это возможно. Это немного трудно читать как есть ...: P
Jwosty
сделал их более очевидными; и теги спойлера предназначены, потому что трюки сначала не очевидны
masterX244
2
Подождите, значит, первый действительно выдает ошибку? Это противоположно тому, что задает вопрос. А почему не просто System.exit (1) во втором?
Riking
3
Ни один Java-программист не ожидает переполнения стека во втором фрагменте. Извините, это слишком очевидно.
Тобиас
1
@VVK Привычка использовать кодгольфинг enum{вместо class{сохранения байта
masterX244
6

С

Строки и массивы в 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] не очень хорошо известны случайному кодеру и не поддаются логике индексации массива. Во-вторых, '' + string выглядит как добавление 2 строк, но с неверным типом кавычек. И в-третьих, & i ++ выглядит как адрес целого числа (но об этом позаботится приоритет). Наконец, мы пишем за пределами строкового литерала (но не за пределами резервного буфера).
Орион
Не кажется слишком плохим. Я только немного кодировал в C ++, но я могу понять это.
Навин