Напишите в программе строку, которая выглядит бесполезной [закрыто]


26

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

int main(void) {
    /* The line below is actually needed. */
    2 + 2;

    return 0;
}

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


2
Зачем нужна строка в примере?
Гари Б.Н.

3
@GariBN Это не так: «в этом примере строка на самом деле не нужна, это всего лишь пример».
Эликсенид

9
@EdCottrell Полезно знать ... Я думал, что пропустил некоторые основные вещи ...
Гари Б.Н.

2
Так что это нужно. Для примера. :-)
Флориан Ф

1
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что скрытые проблемы больше не обсуждаются на этом сайте. meta.codegolf.stackexchange.com/a/8326/20469
кошка,

Ответы:


33

С

int main(int argc, char **argv) {
    switch(argc) {
        case 2:
            ;
            int allowed = 0;
        case 3:
            argc--;
            break;
        default:
            argc = 3;
    }
    return 0;
}

Не скомпилируется, если мы удалим сингл ;.

РЕДАКТИРОВАТЬ :

Решение ниже:

Это происходит потому, что caseоператор является просто меткой, и, как таковой, должен сопровождаться оператором (который стандарт называет «спецификатором действий, которые должны быть выполнены», что исключает объявления). Чтобы предотвратить это, мы предварить декларацию ;, а пустое заявление . Спецификации для caseэтикетки можно найти здесь на странице 142 (131 в документе)


4
GCC говорит, что «метка может быть только частью утверждения, а декларация не является заявлением».
Вортико

1
Я был просто укушен этим в программе, которую я пишу для школы.
Кевин - Восстановить Монику

Это на самом деле делает настоящие программы такими уродливыми: \.
Вэл говорит восстановить Монику

23

C / C ++

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

Учебное пособие №. 2 : чтение чисел, выполнение математических операций над ними и печать результатов.

//////////////////////////////////////////////////
///////////////////////////////////////////////////
/////                                            //
/////           T  U  T  O  R  I  A  L           //
/////                                            //
///////////////////////////////////////////////////

#include "stdio.h"

int main()
{
    ///////////////////////////////////////////////
    // Local variables (int means integer!!)      /
    int a, b, result;

    ///////////////////////////////////////////////
    // Reading them in                            /
    scanf("%d", &a);
    scanf("%d", &b);

    ///////////////////////////////////////////////
    // Performing an operation, e.g. addition!!!  /
    result = a+b;

    ///////////////////////////////////////////////
    // Why is the next line absolutely mandatory??/
    result = 42;
    printf("The result is: %d", result);

}

Удаление строки, result = 42;которая на первый взгляд выглядит излишней и, с учетом заявленной цели, фактически неверной, фактически приведет к тому, что программа не будет выполнять то, что говорится в описании.

Зачем?

Триграфы бьют снова! \ / будет заменен препроцессором на \ , который, в свою очередь, объединит следующую строку в комментарии. Результат = 42; становится частью комментария, поэтому «сохраняет» строку печати. С результатом = 42; строка удалена, строка printf будет проглочена комментарием. Некоторые компиляторы могут выдавать предупреждение, или триграфы могут быть отключены по умолчанию и должны быть включены, чтобы этот пример работал. Подсветка синтаксиса также может выдать его, но есть компиляторы и IDE, которые не оставят вас равнодушными.


По крайней мере, в gcc вы должны указать, что хотите использовать триграфы, добавив этот флаг (-trigraphs). Без этого gcc выдает предупреждение и игнорирует триграфы.
Гари Б.Н.

4
Хороший! Я рад, что не прокрутил слишком далеко, чтобы понять это. Вы можете изменить свою цитату в текст спойлера, начав с >!вместо >.
брезгливое оссифраж

@squeamishossifrage: спасибо, это было мое первоначальное намерение, я использовал >!только не в каждой строке. Я думаю, что они не отображаются для меня, как я их написал. Интересно, что парсер SE это не портит :)
vsz

1
Я знал, что что-то подлое произошло, когда я увидел локальное включение "stdio.h"вместо фактического включения библиотеки,<stdio.h>
Брэден Бест,

1
В тот момент, когда я увидел лишние комментарии, я сказал вслух: «Где триграф? Должен быть триграф… А, вот и он».
кот

19

Пробелы

К сожалению, я не могу показать свою программу здесь, потому что StackExchange удаляет все конечные пробелы. То же самое относится и к pastebin.com и pastie.org, поэтому я не могу ссылаться на них.

Конечно, вся программа «выглядит бесполезной», но если вы удалите какую-либо строку, она сделает что-то другое.


41
Но, к счастью, ничего ценного не будет потеряно, потому что весь язык бесполезен :-)
брезгливый оссифраж

1
@Timwi, а как насчет поля «сырые данные вставки»?
Брэден Бест

1
@Timwi Я только что проверил это здесь , и я понимаю, что ты имеешь в виду. Но если вы поместите текст без пробелов, он будет отправлен, а необработанные данные вставки останутся нетронутыми. Например, вы можете добавить дополнительную строку с надписью «Скопируйте необработанные данные вставки и удалите эту строку»
Braden Best

8
заменить \ т с т. Замените "" на s, замените \ n на n
Cruncher

7
Лучшая шутка в истории: публиковать что-то без написания кода
Каз Вулф

9

JavaScript:

for (var a = 0, b = 4; ++a < b; a++)b+-

2 + 2; // This line is needed, or it will alert twice!
alert(a);

Причина этого в том, что тело forесть b+-, а не b++или b--; поэтому, если вы удалите требуемую строку, это добавит к bзначению -alert(a).


«это увеличит bценность alert(a)»: так не должно b+-быть b+=?
Гауранг Тандон

@GaurangTandon Нет; Идея в том, что это выглядит как b++или b--.
Зубная щетка

что на самом деле означает b +?
Mhmd

5
@ user689 b + -2 + 2. Вот почему, если вы удалите строку с 2 + 2;, она оценивается как b + -alert(a);.
Зубная щетка

8

C:

#include <stdio.h>
#include <string.h>

int main() {
    int i,sum;
    char s[4];

    /* Add all the integers < 1000 that contain no '0' or '9' */
    sum=0;
    for (i=0; i<1000; i++) {
        sprintf(s,"%d",i);
        if (strchr(s,'0')) goto skip;
        if (strchr(s,'9')) goto skip;
        sum += i;
      skip:
        i = i; /* Don't delete this line! */
    }
    printf("The answer is %d\n",sum);  /* <<< Should be 258948 */
    return 0;
}

Если вы удалите строку, i = i;то код не будет работать. Это потому что...

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


7

APL

Вот функция APL:

i_←{
  ⍺←⎕IO ⋄ ⎕IO←⍺
  ⍵⍴⍳×/⍵
}

Он делает то же самое, что и монадический J i.:

      i_ 5 5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Может принимать необязательный левый аргумент, который дает смещение:

      0 i_ 5 5
 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

Линия ⍺←⎕IO ⋄ ⎕IO←⍺выглядит бесполезным ( «Присвоить ⎕IOк , а затем назначить на ⎕IO»), но первая часть работает только если не левый аргумент не задан, поэтому на самом деле это что - то сделать:

  • если нет , установите в (глобальный) ⎕IO.
  • установить (локально) ⎕IOна

7

C #

Func<int, int> fibo;
fibo = null; //Note that this can be set to *any* Func<int, int> reference.  It doesn't matter.
fibo = x => x < 1 ? 1 : fibo(x-1) + fibo(x-2);

Переменная fiboдолжна быть назначена до того, как вы сможете использовать ее внутри лямбды, даже если вы назначаете эту лямбду fiboсебе. Если вы удалите (казалось бы, бесполезное) назначение, произойдет ошибка компилятора («Использование неназначенной локальной переменной« fibo »»).


Это не исключение пустой ссылки, это ошибка компилятора неинициализированной переменной. Кроме того, лучше переместить объявление в его собственную строку, потому что объявление не бесполезно.
Кендал Фрей

@KendallFrey Хорошая мысль! Исправлена.
Бен Райх

5

Пакет Windows:

echo hello
pause
echo world

Установите работающую программу и измените файл на:

rem test01
pause
echo hello world

Если вы удалите или измените размер комментария, это вызовет хаос, поскольку 1-й экземпляр программы приостанавливается, а затем продолжает интерпретацию с 19-го байта и далее.


Я не вижу никаких комментариев.
Орион

4
REM (примечание) является оператором комментария - stackoverflow.com/questions/11269338
OJW

4

Джава

package stackexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Curl
{
    public void getUrl(String address)
    {
        try {
            URL url = new URL(address);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            /* don't remove this line! */
            http://codegolf.stackexchange.com

            while( true ){
                String line = input.readLine();
                if( line==null ) break http;
                System.out.println(line);
            }

            input.close();

        } catch(IOException ex){
            // ignore.
        }
    }

    public static void main(String[] args) {
        Curl curl = new Curl();
        curl.getUrl("http://codegolf.stackexchange.com");
    }
}

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

            http://codegolf.stackexchange.com

компилируется даже без предупреждения. На самом деле, программа не компилируется без него.

На самом деле это ярлык http:, за которым следует комментарий //codegolf.... Метка применяется к while и используется в break http;выражении.


1
Некоторое объяснение, пожалуйста, или я уберу эту строку, что бы вы ни говорили.
Билл Вуджер,

3

Рубин

require 'prime'

# Given a regular expression, return the smallest prime containing it
# and the substring of the prime that matches it
def smallest_prime_matching_regexp(regexp)
  match = 'this assignment is necessary even though the value is never used'
  prime = Prime.find { |n| match = n.to_s[regexp] }
  return prime, match
end

[ /4/, /1+2/, /[02468]{2,}/ ].each do |regexp|
  prime, match = smallest_prime_matching_regexp(regexp)
  puts "#{regexp.inspect}:\t#{prime} (#{match})"
end

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

Строка необходима, потому что переменная, инициализированная внутри блока, является локальной для этого блока. Если мы инициализируем его вне блока, то значение может выйти в область действия метода.

Выведите как есть:

/4/:    41 (4)
/1+2/:  127 (12)
/[02468]{2,}/:  223 (22)

Вывод с удаленной первой строкой метода:

неопределенная локальная переменная или метод match для main: Object (NameError)


1
Совершенно очевидно, зачем это нужно ... и в любом случае, лучший способ написать это было бы простоmatch = Prime.find { |n| n.to_s[regexp] }
дверная ручка

1
Это не будет делать то, что я хочу ... Prime.findвозвращает n(например, 223), и matchдолжно быть n.to_s[regexp](например, "22"). Очевидно, я придумал проблему, чтобы сделать это необходимым.
гистократ

Ах, извините, не заметил , что вы звонили findна Primeи не массив. Во всяком случае, все еще довольно легко заметить, зачем нужна эта линия ...
Дверная ручка

Справедливо. Может быть, мой коллега просто не наблюдал.
гистократ

Да. Нет объявлений переменных, но противоположный подход к настройке по умолчанию local / nonlocal к тому, что делает Python. Это будет странно, если я когда-нибудь решу изучать Руби.
user2357112 поддерживает Monica

3

PHP

<?php
$some_html_text= <<<EOT
<h1>This is a Header </h1>
<body> This is a body </body>
EOT;
//This is a comment    

Здесь \n//This is a commentнеобходимо. Без этого код не будет работать.

По крайней мере, \nсимвол необходим после того, EOT;как запустить его правильно


3

JAVASCRIPT

var a = function(b) {
    return b;
}

; // This must be here

(function() {
    // more code
}());

Без точки с запятой тогда aстало бы то, что когда-либо возвращаемое значение из 2-й функции - в этом случае это undefined. Потому что функция, изначально назначенная для, aбудет сразу же выполняться со второй функцией в качестве аргумента b.


2

COBOL (мэйнфрейм IBM)

   ID DIVISION. 
   PROGRAM-ID. USELESS. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  W-WHEN-COMPILED              PIC X(8)BX(8) VALUE SPACE.
   PROCEDURE DIVISION. 
       IF W-WHEN-COMPILED EQUAL TO SPACE 
           NEXT SENTENCE 
       END-IF 
       MOVE SPACE                   TO W-WHEN-COMPILED. 
       MOVE WHEN-COMPILED           TO W-WHEN-COMPILED 

       DISPLAY W-WHEN-COMPILED " HELLO WORLD!" 
       GOBACK 
       . 

Если вы запустите вышеупомянутую программу (любой COBOL IBM Mainframe начиная с COBOL II (первый компилятор IBM по стандарту 1985 года, возможно, также другие IBM COBOL), то вы получите:

22.02.14 13.11.02 HELLO WORLD!

Однако, если вы удалите бесполезную строку «ПЕРЕМЕСТИТЬ ПРОСТРАНСТВО В W-КОГДА-СОБИРАЕТСЯ». (поле имеет начальное значение пробела и содержит другое содержимое, помещенное в него в следующей инструкции, и оно в любом случае разветвляется) программа не выдает никаких данных и фактически завершает работу (U4038) (что означает, что происходит сбой) со следующим сообщением :

 IGZ0037S The flow of control in program USELESS proceeded beyond the 
          last line of the program.  From compile unit USELESS at entry 
          point USELESS at compile unit offset +000003AC at entry offset
          +000003AC at address 119003AC. 

(код сообщения и текст могут отличаться у разных компиляторов, смещения зависят от фактического используемого компилятора и параметров компиляции, адрес зависит от того, куда загружается программа при выполнении EXECuted).

Причина в том NEXT SENTENCE. Это Secret GO TO. Компилятор выслеживает следующий полный останов / период в источнике и генерирует ветвь для следующей инструкции. Начиная с COBOL II, использование полных остановок / периодов было смягчено. Программа должна заканчиваться полным остановом / периодом. В этом случае ветка находится вне конца программы.

Обе программы компилируются на 100% чисто (без диагностических сообщений, код возврата ноль).

Такое поведение является глупым «расширением IBM» для COBOL. 1985 Стандарт не допускает NEXT SENTENCEв IF/ END-IF( CONTINUEиспользуется вместо этого, который является не-ор). IBM позволила это - время от времени вызывая ужасные ошибки.


2
#include <stdio.h>
#include <stdlib.h>

void strcmp_or_die(char *s, char *t) {
    if(!strcmp(s, t)) {
        printf("Success!\n");
    } else {
        int *ptr = NULL;
        *ptr = 0;
    }
}

int main(void) {
    char blah = '\0'; //segfaults without this line

    char v[2] = "ok";
    strcmp_or_die(v, "ok");
}

Простая проблема переполнения строки.


1
Любой приличный компилятор даст вам диагностику «слишком много инициализаторов».
Бен Фойгт

Без какой платформы segfaults blah? Здесь, с OpenBSD 5.5 / amd64 и системой gcc, он никогда не пересекается, независимо от того, существует он или blahнет. Скомпилированная программа выделяет 16 байтов стекового пространства и копирует 16-битное значение «ok» в первые 2 байта. 3-й байт неинициализирован по счастливой случайности. Если blahон есть, он находится в 16-м байте и до сих пор не завершает строку.
Kernigh

2

~ - ~!

Это, пожалуй, самый глупый, самый очевидный здесь.

'=|hello\|:
'=~!|Useless?\|:
@'[|y|]|n|:

Выдает ошибку без этой второй строки, с которой он печатает y.

обратная косая черта не является побегом, хе-хе.


Как вы произносите название языка?

8
@professfishfish~-~!
Timtech

1
@professfishfish Это было бы "без комментариев".
cjfaure

1

Пакет Windows

Это командный файл, который печатает числа от 1 до 10 с пустой строкой после каждого:

@echo off

setlocal EnableDelayedExpansion

set NL=^


rem Previous two lines deliberately left blank for NL to work.

for /l %%a in (1,1,10) do (
    echo %%a!NL!
)

endlocal

pause

Это эффективно использует грязный хак для хранения новой строки внутри переменной (использование отложенных расширений избавляет от более страшной строки NL в связанном ответе). Если вы удалите или иным образом измените две совершенно бесполезные пустые строки над комментарием, это не сработает.


0

TROFF

Troff - самая замечательная система обработки текста. Я использую это для своих документов. Для того, чтобы быть готовым к использованию, требуется система макросов, а самым известным является msпакет макросов. Давайте скомпилируем следующий фрагмент кода с классическим -msвариантом.

.\" -ms macro package
.\" the following line seems to be useless
\& \" print an invisible character
.ad c
.sp |300p \" absolute vertical positionning
.ps 36p
.ft B
My title.
.PP
This is a paragraph.

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

Только что проверил мою любимую версию troff, которая не очень известна (семейная реликвия), но я почти уверен, что она работает так же и с GNU troff.


Хорошо, это происходит и в LaTeX. Без пустого поля или чего-то подобного вертикальный интервал не работает должным образом.
Орион
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.