Що? Немає помилки? [зачинено]


197

Ваше завдання просте. Напишіть програму, яка, очевидно, повинна створювати помилку на перший погляд при компілюванні або запуску, але або не робить, або створює якусь іншу непов'язану помилку. Це конкурс популярності, тому будьте креативними.


11
хмммм .... це тизер мозку. +1
Тім Сегуїн

1
Бажаю, що я міг би його знайти ... був старий приклад PL / I, який включав вислів у рядку "якщо якщо якщо = то тоді тоді = інше ще = якщо тоді ще ..." (PL / я дозволив використовувати його ключові слова як імена змінних і мали умовний вираз, схожий на C?: що також використовував ключові слова if / then / else ...)
keshlam

8
Я пропоную цілу мову, що не має розуму, тому що BF-код просто виглядає, що він не збирається.
Agi Hammerthief

@NigelNquande, лише якщо ви з цим не знайомі ...;)
Jwosty

Відповіді:


281

C ++

Переконайтеся, що ви компілюєте такий код у стандартному відповідному режимі (наприклад, для g ++ використовуйте прапор -ansi):

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

Як це працює:

?? / - це триграфічна послідовність, яка перекладається на зворотну косу рису, яка уникає наступного нового рядка, тому наступний рядок все ще є частиною коментаря і тому не створюватиме синтаксичну помилку. Зауважте, що у C ++ пропущення повернення в mainчітко визначене та еквівалентне поверненню 0, що вказує на успішний запуск.


7
Я відчуваю, що перша відповідь щойно інста-перемогла це право у біту.
тимчасове_користувач_ім'я

1
Це також дійсно в C99.
Р ..

1
є попередження з -Wall
BЈовић

2
@ BЈовић Стіна завжди кидає попередження про все
Kiwy

4
@Kiwy Він кидає попередження лише для коду сміття, як вище. -Wall не кидає попередження про все.
BЈовић

86

Рубін

Завжди шанувальник цього.

x = x

Ні NameError. x зараз nil.

Це просто "особливість" Рубі :-)

Ось більш приземлений, який раніше мене діставав:

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, ми переходимо прямо до іншого і не створюйте винятку. Ця помилка неймовірно очевидна в будь-якому середовищі, що виділяє синтаксис, на щастя (?) Код гольфу - це не таке середовище.


5
Ти мене зрозумів. Раніше я робив і Python, і Lua, а зараз починаю з Ruby. Луа використовує цю.
Рікінг

7
Сенс Всесвіту нічого не бачити?
user80551


77

C?

Тут досить нормальний код ...

void main() = main--;

Це Haskell, а не C. Він визначає функцію з назвою "void", яка бере два аргументи. Перший називається "основним", і якщо другий (без імені) - порожній кортеж, він повертає "головну" змінну. "-" починає коментар у Haskell, тому ";" коментується.


21
Так іншими словами, це обман?
Містер Лістер

75
Обман - це нормально в змаганнях з викликом кодів. Ми називаємо це творчістю. : P
Joe Z.

31
Я б назвав це обманом, а не творчістю. Ви повинні визначити середовище, в якому ви працюєте, перш ніж ви навіть могли розглянути, чи буде якийсь код помилковим чи ні. Інакше я міг би просто подати вам шум лінії, який є Malbolge, і запитати, чи він компілюється.
Тім С.

5
Це просто повинно змусити вас зупинитися на секунду і піти "ей, чи можна це зробити ?" :)
intx13

10
@JoeZ. У деяких випадках це може виглядати як перл.
user80551

72

JavaScript

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

Ось як це працює:

Перший aнасправді є а(тобто Cryical 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" (або "a"?) І не зможете знайти те, що очікуєте, але, просто читаючи, ви його не бачите (принаймні, у шрифті, показаному тут).
Тім С.

70

JavaScript

Коли я надав наступний код, мені багато разів говорили: "Це повинно бути помилковим помилкою! Як це може працювати?" .

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

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

Як ви, напевно, знаєте, в JavaScript все, крім літералів, є об'єктом. Числа також є об'єктами. Таким чином, теоретично (і практично) ви можете отримати властивості або викликати методи будь-якого нелітерального за допомогою точкових позначень, як ви це робите 'string'.lengthабо [1,2,3].pop(). У разі чисел ви можете зробити те ж саме, але вам слід пам’ятати, що після однієї крапки аналізатор буде шукати дробову частину числа, що очікує значення float (як у 123.45). Якщо ви використовуєте ціле число , ви повинні «сказати» парсеру , що дрібна частина порожня, встановивши додаткову точку перед адресацію властивості: 123..method().


18
Як хлопець з 422
луа

3
Раніше такого використання не бачив, дуже акуратно.
Ніт

5
Відчуваєте себе за те, що чудово звикли до ..позначень, але абсолютно незрозумілі щодо .toString(a freaking argument here?)нотації: P Ну добре, зрозумів це на сьогодні :)
Девід Малдер,

Що це означає? І чому ? Мені цікаво.
Ніколя Барбулеско

3
Для ледачих аргумент вказує базу (тому це буде друкуватись 42 у двійковій формі) і зовсім не важливо для цього коду. ..є заплутаною частиною.
Кет

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.

Пояснення

  • [не особливий для bash, тому < 2виконує, як зазвичай, перенаправлення. Якщо 2в поточному каталозі немає файлу з ім'ям , це призведе до помилки.

  • Через цю помилку вище, команда раніше &&матиме ненульовий статус виходу і 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

Java

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

Тут не переповнюється стек; рухатися по.

На перший погляд, це має призвести StackOverflowError, але це не так! Він насправді просто працює назавжди (принаймні, для всіх практичних цілей; технічно він би припинився через час на багато порядків більше, ніж вік Всесвіту). Якщо ви хочете знати, як / чому це працює, дивіться це . Крім того, якщо вам трапляється цікаво, чому ми можемо викликати main()без аргументів, коли основний метод, як правило, потребує String[]аргументу: це тому, що ми тут оголосили його змінним аргументом, що цілком справедливо.


3
Як пояснюється зв'язане вами питання, воно не працює нескінченно, але натомість надзвичайно довго.
Кевін

1
@Kevin Давайте тут не зайво педантично; "довше віку Всесвіту" є для всіх практичних цілей "назавжди".
Аршаджі

8
Ви кажете "Тут не переповнюється стек", коли насправді система продовжує викидати стек переповненням і, врешті, викине виняток переповнення стека. (як ви згадуєте, врешті-решт це може бути дуже довгим). І, це залежить від глибини укладання. На меншій VM або вбудованій системі глибина стека може бути значно меншою.
Маккей

@McKay Це твердження, очевидно, є просто викидним рядком, яке не повинно сприйматися буквально. ОП запитує програму, схожу на те, що вона повинна створювати помилку, але ні. У загальному випадку відповідь вище відповідає цій вимозі. Звичайно, ми можемо створити незрозумілу ситуацію, коли цього немає, але це не скасовує відповідь. Я сподіваюсь, що ви переглянете свій голос.
Аршаджій

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 чому% 20it% 20буде% 3F .


36

VBScript

&Оператор VBScript є конкатенація , але то , що на землі є &&і &&&оператори? (Нагадаємо, що оператор "і" у VBScript є And, ні &&.)

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

Цей фрагмент програми є легальним VBScript. Чому? А яка цінність x?

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


8
Ось тільки ... ух.
прим

27

Ціль-С

Не велика справа, але це мене здивувало, намагаючись поставити посилання всередині коментаря:

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

http - тут кодова мітка, такі мітки використовуються в інструкціях goto


8
Це має працювати будь-якою мовою, схожою на C, яка підтримує //коментарі.
Ілмарі Каронен

Так, напевно, я просто не був впевнений, коли публікував
Пьотр

14
Обмежте лише одну URL-адресу для кожного протоколу на область дії.
Бен Войгт

1
Ви все одно можете використовувати https: // в тому ж обсязі.
Флоріан Ф

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 запускає метод.


Нарешті ... Ось ФОО та БАР :)
VVK

1
Ось для чого і foo, і бар;) назви речей, які насправді не мають значення.
Маккей

22

С

main=195;

Працює на платформах x86, де 195 - опкод для ret. Нічого не робить,


Опкод для 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 дає segfault, але const int main = 195; працює.
w4etwetewtwet

21

Java

Напевно, занадто очевидно.

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не вараги;)
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асоціюються з покажчиками, тому можна очікувати нульової перезавантаження покажчика.


11
На щастя, C ++ 11 дозволяє реалізаціям визначити NULLяк nullptr, а реалізації, які так роблять (ще я не знаю, але я їх очікую) призведе до очікуваної помилки сегментації.
hvd

16

Пітон

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

Прекрасно справедливий, але висновок важко здогадатися. Перші 3 "символи починають багаторядковий рядок, а наступні два - частина рядка. Наприкінці перші три" s "завершують рядок, а останні два - порожній літеральний рядок, який об'єднується парсером у рядок з рядком .


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 є позитивна і негативна нескінченність, і помилки для ділення на нуль немає.


2
Ви також зможете зробити деякі трюки і з NaN ...
intx13

8
Мех, це відбувається на будь-якій мові з плавцями.
Навін

3
@Navin: будь-якою мовою з плаваючими, де поділ на нуль не викликає помилок.
nwk

2
@nwk Стандарт IEEE для плавців говорить, що ділення на нуль повинно бути інф. Я не знаю жодної мови, яка б це змінила.
Навін

1
IEEE 754 визначає дві моделі: сигналізації NaN / Inf (які піднімають виключення на FP розподіл на нуль, квадратний корінь з -1, згущених / переповнення, і т.д.) і НЕ-сигналізація (яка лікує NaN/ Infяк звичайне argebraic значення з чітко визначеною математикою на них). Сучасне обладнання FP може бути налаштоване для роботи в обох напрямках. Мова-агностик; сором не знати.
улідко

14

C ++

Змішування триграфів та лямбдів, що не мають простору, може бути дуже заплутаним і, безумовно, виглядає помилково для людей, які не знають про триграфи:

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

Як це працює:

Деякі послідовності, що складаються з 3 символів, починаючи з ??, називаються триграфами і будуть заміщені повністю сумісним препроцесором. Попередньо оброблений рядок виглядає так: return ~ [] () {return "\ x00FF"; } () [0]; Як видно, це не що інше, як зайва лямбда-функція, що повертає рядок, що складається з символу 0xFFth. [0] просто витягує цей символ і ~ ноти його, так що 0 повертається.


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 = /
Ри-

1
@minitech Так. Я розумію, це була помилка в оригінальній реалізації Split в VB6. У .NET вони навмисно "додали" (або, можливо, це задокументовано краще слово) поведінку для порожніх масивів, що повертають UBound -1, щоб підтримувати зворотну сумісність з усім кодом VB6, який скористався цим хаком. Розщеплення нульового рядка - єдиний спосіб отримати цей масив у VBA / VB6 без викликів API Windows.
Комінтерн

12

Javascript

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

Дає: 5

При цьому:

5.toString();

Надає SyntaxError

Як це працює:

JavaScript намагається розібрати крапку на число як літерал з плаваючою комою


13
Як так сталося, що ти розмістив абсолютно той самий випадок, що і я через годину після мене?
VisioN

1
Ей, бачення, вибач, але я не перевірив твою відповідь. Я також додав кейс із простором. Я читав це один раз на JavaScript саду нічого іншого.
Sumeet Kashyap

1
Sumeet, не шкодуй. Ваша відповідь приємніша - і набагато чіткіша - ніж відповідь від @VisioN.
Ніколя Барбулеско

12

HTML

Перший пост тут, я не впевнений, отримаю це чи ні, але ось іде.

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

Це .htmlфайл ...


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
Це конкурс на популярність. Для збереження байтів не потрібно чітко додавати ур-код. Просто переформатуйте його для кращої читабельності;)
Сонго

Пізніше я додамо читабельну версію. Я використовував таку саму точну відповідь і зовсім не редагував її.
Ісмаїл Мігель

foreach(e()as&$e);є стрижнем цього рішення. e()це просто продовжувати перевірку синтаксису і &$eпісля того as, що є причиною відмови.
Конструктор

Насправді все відіграє важливу роль.
Ісмаїл Мігель

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

С

Це нагадало мені про помилку, з якою я зіткнувся, коли дізнався С. На жаль, оригінальний варіант, здається, не працює з поточним 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підняттям вгору від 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

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

Чому це працює:

Неактивизовані поля мають значення за замовчуванням. У цьому випадку d - лише 0 . 0/0 = NaN у подвійному поділі, і NaN ніколи не дорівнює собі, тому значення if повертає хибне. Зауважте, це не спрацювало, якби у вас був 0/0 == 0/0 , так як при цілому поділі 0/0 НЕ БУДЕ кинути 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і альтернативою для !. complТут використовується спочатку переосмислення, operator~а потім визначення деструктора. Ще одна хитрість полягає в тому, що operator compце функція перетворення від типу compдо себе. Дивно, але стандарт не забороняє таку функцію перетворення - але він говорить про те, що така функція ніколи не використовується.


8

VBScript

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

'Output: :)

Що це робить:

Імена функцій, підменю та змінних у VBScript можуть бути будь-якими, якщо ви використовуєте квадратні дужки. Цей скрипт містить функцію, яку називають :(одним аргументом, "):"але, оскільки вони не дотримуються звичайного правила іменування, вони оточені квадратними дужками. Повернене значення встановлюється значенням параметра. Додаткова двокрапка використовується для отримання всього на одній лінії. Оператор Msgbox отримує посилання на функцію (але дужки не потрібні) і називає її смайлом :)як параметром.


1
Стільки хмурих облич :(
Joe Z.

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

Java

enum derp
{

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

І як це працює:

Ялинки, на вашу думку, Енум не дійсний, але його дійсний; тоді ви думаєте, що він буде друкувати стандартні атрибути об'єктів 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

зробили їх більш очевидними; і теги спойлерів призначені для того, що спочатку очевидні хитрощі
masterX244

2
Зачекайте, значить, перший насправді видає помилку? Це протилежне тому, що задається питанням. А чому б не просто System.exit (1) у другій?
Рікінг

3
Жоден програміст Java не очікує переповнення стека у другому фрагменті. Вибачте, це занадто очевидно.
Тобіас

1
@VVK codegolfing звичка використовувати 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 [рядок], не відомі випадковим кодером і не піддаються логіці індексації масиву. По-друге, рядок '' + виглядає як додавання 2 рядків, але з неправильним типом лапок. І по-третє, & i ++ виглядає як адреса цілого числа (але пріоритет береться за це). Нарешті, ми пишемо за межами рядкового літералу (але не за межі більшого резервного буфера).
Оріон

Не здається занадто поганим. Я лише трохи зашифрував C ++, але я можу це зрозуміти.
Навін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.