Programda işe yaramaz görünen bir satır yazın [kapalı]


26

Bir program yazın (boyut önemli değil) ve işe yaramaz görünen bir satır koyun, ama aslında değil - eğer kaldırılırsa, program çökebilir ya da yanlış bir şey yapar. Bir yorum tarafından kullanılmayan görünen satırı işaretlemekten çekinmeyin ya da aşağıdaki örnekte olduğu gibi kod açıklamasından bahsetmekten çekinmeyin (tabii ki, bu örnekte, satır aslında gerekli değildir, bu sadece bir örnek).

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

    return 0;
}

Bu popülerlik yarışması olduğu için en yüksek oyu alan çözüm kazanıyor.


2
Örnekteki çizgi neden gerekli?
Gari BN

3
@GarBN Bu değil: "Bu örnekte, satır aslında gerekli değildir, sadece bir örnek."
elixenide

9
@EdCottrell Bilmekte yarar var ... Bazı temel şeyleri özlediğimi sanıyordum ...
Gari BN

2
Bu yüzden edilir gerekli. Örnek için. :-)
Florian F

1
Bu soruyu konu dışı olarak kapatmak için oy veriyorum, çünkü bu konudaki aşikar zorluklar artık konu dışı. meta.codegolf.stackexchange.com/a/8326/20469
kedi

Yanıtlar:


33

C

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

Tek olanı kaldırırsak derleme yapmayacağız ;.

EDIT :

Aşağıdaki çözüm:

Bu, bir caseifadenin sadece bir etiket olması ve bir ifadeyle izlenmesi gerektiği için (standardın bildirimleri yasaklayan "gerçekleştirilecek eylemler için belirtici" olarak ifade ettiği) olur. Bunu önlemek için, bildirimi a ;, null deyimine ekleriz . caseEtiketin teknik özelliklerini burada 142. sayfada bulabilirsiniz (131 doküman içi).


4
GCC, "bir etiket yalnızca bir ifadenin parçası olabilir ve bildirim bir ifade değildir" diyor.
Vortico

1
Sadece okul için yazdığım bir programda ısırıldım.
Kevin - Monica

Bu, gerçek programların çok çirkin görünmesini sağlar: \.
val, Monica

23

C / C ++

Giriş / öğretici tarzında yazılmış sadece bazı kod ...

Öğretici no. 2 : sayıları okumak, üzerlerinde matematiksel işlemleri yapmak ve sonuçları yazdırmak.

//////////////////////////////////////////////////
///////////////////////////////////////////////////
/////                                            //
/////           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;Hem ilk bakışta hem de gereksiz görünen çizginin kaldırılması ve belirtilen amacı göz önüne alındığında, aslında yanlış olması, aslında programın açıklandığı gibi yapmamasına neden olacaktır.

Niye ya?

Trigraphs tekrar grev! / / , önişlemci tarafından \ ile değiştirilecek ve sırayla bir sonraki satırı yorumda birleştirecektir. Sonuç 42 =; Yorumun bir parçası olur, bu nedenle baskı satırını "kaydeder". İle sonuç 42 =; satır kaldırılırsa, printf satırı yorum tarafından yutulur. Bazı derleyiciler bir uyarı verebilir veya varsayılan olarak trigraph'lar kapatılabilir ve bu örneğin çalışması için açık olması gerekir. Sözdizimi vurgulaması da ona ihanet edebilir, ancak etrafınızda sizi hiçbir zaman akıllı bırakmayan derleyiciler ve IDE'ler vardır.


En azından gcc'de bu bayrağı ekleyerek (-trigraph) trigraph kullanmak istediğinizi belirtmelisiniz. Bu olmadan, gcc uyarıyı yükseltir ve trigraphları yok sayar.
Gari BN

4
Güzel bir! Anlamadan önce çok aşağı kaymadığım için memnunum. Blockquote'unuzu spoiler metnine değiştirerek >!sadece yerine başlatabilirsiniz >.
pembemsi ossifrage

@squeamishossifrage: teşekkürler, bu benim asıl amacımdı >!, her satırda kullanmıyorum . Sanırım onları yazdığım gibi benim için göstermiyorlar. İlginç bir şekilde, SE ayrıştırıcısı bunu mahvetmez :)
vsz

1
Ben ikinci bir yerel şunlardır gördüğümüz ayakta şey sinsi olduğunu biliyordum "stdio.h"dahil yerine gerçek kütüphanenin,<stdio.h>
Braden İyi

1
Gereksiz yorumları gördüğüm an yüksek sesle, "Trigraph nerede? Bir trigrap olmalı-- Ah, işte orada."
kedi

19

Beyaz boşluk

Ne yazık ki burada programımı gösteremiyorum, çünkü StackExchange tüm sondaki boşlukları kaldırıyor. Aynısı pastebin.com ve pastie.org için de geçerlidir, o yüzden ben de bağlantı kuramıyorum.

Elbette, tüm program “işe yaramaz” gibi görünüyor, ancak herhangi bir satırı kaldırırsanız, farklı bir şey yapacaktır.


41
Çünkü Neyse değerli bir şey, kaybolacak tüm dil yararsız olduğunu :-)
alıngan ossifrage

1
@Timwi "ham hamur verileri" kutusundan ne haber?
Braden Best

1
@Timwi Sadece burada test ettim ve ne demek istediğini anladım. Ancak boşluk olmayan bir metin koyarsanız, gönderir ve işlenmemiş hamur verilerine dokunulmaz. Örneğin, "Ham hamur verilerini kopyala ve bu satırı sil" diyerek fazladan bir satır koyabilirsiniz
Braden Best

8
t ile değiştirin. S "ile", \ n'yi n ile değiştirin
Cruncher

7
Şimdiye kadarki en iyi şaka: Aslında kod yazmadan bir şey gönderin.
Kaz Wolfe,

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

Vücut çünkü çalışır nedenidir forolduğu b+-değil, b++ya da b--; bu nedenle, gerekli satırı kaldırırsanız b, değerine eklenir -alert(a).


"Bu katacaktır bdeğeri alert(a)": So, olmamalıdır b+-olmak b+=?
Gaurang Tandon

@GaurangTandon No; fikir gibi görünüyor olduğunu b++veya b--.
Diş fırçası,

b + - gerçekte ne anlama geliyor?
Mhmd

5
@ kullanıcı689 b + -2 + 2. Bu yüzden çizgiyi silerseniz, 2 + 2;değerlendirir b + -alert(a);.
Diş fırçası,

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

Satırı silerseniz, i = i;kod çalışmaz. Bunun nedeni ise...

... aslında derleme bile olmaz. C standardına göre , yukarıdaki örnekte atlama gibi etiketlerin bir ifade ile ilişkilendirilmesi gerekir . Tek bir noktalı virgül bile yeterli olurdu, ancak tüm satırı silerseniz, etiketin ilişkilendirilmiş bir ifadesi yoktur ve derleme başarısız olur. Bu cevap biraz daha ayrıntılı olarak açıklar.


7

APL

İşte bir APL işlevi:

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

J'nin monadikleriyle aynı şeyi yapıyor 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

Ofseti veren isteğe bağlı bir sol argüman alabilir:

      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

Çizgi ⍺←⎕IO ⋄ ⎕IO←⍺faydasız ( "ata bakar ⎕IOiçin , daha sonra atamak için ⎕IO"), ancak ilk bölümü yalnızca hiçbir sol argüman verilirse, bu yüzden aslında bir şey yapar çalıştırır:

  • hayır verilirse (global) olarak ayarlayın ⎕IO.
  • (yerel) ⎕IOolarak ayarla

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

Değişken fibo, bir lambda içinde kullanmadan önce, o lambayı fibokendisine atamış olsanız bile atanmalıdır . (Görünüşte işe yaramaz) atamasını kaldırırsanız, bir derleyici hatası ortaya çıkar (“Atanmamış yerel değişken 'fibo' kullanımı”).


Boş bir başvuru istisnası değil, başlatılmamış bir değişken derleyici hatası. Ayrıca, bildirimi kendi satırına taşımak daha iyidir, çünkü bildirimde fayda yoktur.
Kendall Frey,

@KendallFrey İyi nokta! Sabit.
Ben Reich,

5

Windows Toplu İşi:

echo hello
pause
echo world

Çalışan programı ayarlayın ve dosyayı değiştirin:

rem test01
pause
echo hello world

Yorumu kaldırır veya yeniden boyutlandırırsanız, programın ilk örneği durakladığında ve 19. bayttan itibaren yorumlamaya devam ettikçe tahribata yol açacaktır.


Hiçbir yorum görmüyorum.
orion

4
REM (açıklama) yorum operatörüdür - stackoverflow.com/questions/11269338
OJW

4

Java

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

Bir URL’den bir web sayfasını alan çalışan bir programdır. Hattın şaşırabilirsin.

            http://codegolf.stackexchange.com

uyarmadan derlenir. Aslında, program onsuz derleme yapmaz.

Bu aslında bir etiket, yorum http:ve ardından //codegolf.... Etiket, süre için geçerlidir ve break http;açıklamada kullanılmıştır .


1
Bir açıklama lütfen, yoksa ne söylersen söyleyeyim o satırı kaldıracağım.
Bill Woodger

3

Yakut

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

Son zamanlarda işyerinde benzer bir şey çıktı - bir iş arkadaşım kod incelemesi sırasında görünüşte gereksiz bir şekilde başlatılmamı işaret etti ve açıklamayı bir spoiler bloğuna koymak konusunda gerçekten çok istekliydim. Yani bunu burada yapacağım.

Satır gereklidir, çünkü bir bloğun içinde başlatılan bir değişken o bloğa yereldir. Bunu bloğun dışında başlatırsak, değer yöntem kapsamına kaçabilir.

Çıktı olduğu gibi:

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

Çıkarılan yöntemin ilk satırı ile çıktı:

undefined yerel değişken veya main için yöntem `match ': Object (NameError)


1
Buna ihtiyacım vardı neden Oldukça açıktır ... ve yine, daha iyi bir yolu bu sadece olacağını yazmayamatch = Prime.find { |n| n.to_s[regexp] }
Doorknob

1
Bu istediğimi yapmaz ... Prime.findgeri döner n(örneğin 223) ve matcholması gereken n.to_s[regexp](örneğin "22"). Belli ki bunu gerekli kılmak için problemi kabul ettim.
histocrat

Özür dilerim, aradığınız kişi fark etmedi findüzerinde Primebir dizi değil. Her neyse, neden bu hattın gerekli olduğunu anlamak oldukça kolay ...
Doorknob

Yeterince adil. Belki iş arkadaşım sadece göze çarpmıyordu.
histocrat

Huh. Değişken bildirimler yok, ancak Python'un yaptıklarına yerel / yerel olmayan temerrüde zıt yaklaşım. Ruby'yi öğrenmeye karar verirsem bu çok garip hissedecek.
user2357112,

3

PHP

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

İşte, \n//This is a commentgerekli. Bu olmadan kod çalışmaz.

Düzgün çalıştırdıktan \nsonra en azından bir karakter gerekliEOT;


3

JAVASCRIPT

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

; // This must be here

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

Noktalı virgül olmasaydı, o azaman 2. işlevden elde edilen değerin değeri bu olurdu - bu durumda undefined. Çünkü başlangıçta atanan işlev ahemen ikinci işlevle birlikte argüman olarak yürütülür b.


2

COBOL (IBM Ana Bilgisayarı)

   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 
       . 

Yukarıdaki programı çalıştırırsanız (COBOL II’den bu yana herhangi bir IBM Mainframe COBOL’u çalıştırırsanız (ilk IBM derleyici 1985 standardına, muhtemelen diğer IBM COBOL’lerine de) çıktı:

02/22/14 13.11.02 HELLO WORLD!

Ancak, üç işe yaramaz çizgisini kaldırırsanız "YERLEŞTİRİLMESİ GEREKEN YERLEŞTİR". (alan bir başlangıç ​​boşluğuna sahiptir ve bir sonraki komutun içine yerleştirilmiş başka bir içeriğe sahiptir ve yine de dallanmıştır) program çıktı vermez ve aslında Abends (U4038) (bu mesaj çöker) ile aşağıdaki mesajı izler. :

 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. 

(mesaj kodu ve metin derleyiciler arasında değişecektir, ofsetler kullanılan gerçek derleyiciye ve derleme seçeneklerine bağlı olacaktır, adres EXECuted olduğunda programın nereye yüklendiğine bağlıdır).

Sebebidir NEXT SENTENCE. Bu bir Secret GO TO. Derleyici kaynaktaki bir sonraki tam durak / dönemi yakalar ve aşağıdaki talimat için bir dal oluşturur. COBOL II'den itibaren tam durak / dönem kullanımı gevşetildi. Bir program tam durma / süre ile bitmelidir. Bu durumda, dal programın dışındadır.

Her iki program da% 100 temiz derler (teşhis mesajları yok, Sıfırlama Kodu).

Bu davranış, COBOL için aptal bir "IBM Uzantısı" dır. 1985 Standardı, / NEXT SENTENCEiçine izin vermez ( bunun yerine kullanılır, ki bu işlem yapılmaz). IBM buna izin verdi - zaman zaman korkunç Gotcha'lara neden oldu.IFEND-IFCONTINUE


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

Basit dizge taşması sorunu.


1
Herhangi bir düzgün derleyici size "çok fazla başlatıcı" tanısı verecek.
Ben Voigt

Hangi platform olmadan segfaults blah? Burada OpenBSD 5.5 / amd64 ve sistem gcc blahile orada olup olmadığına bakılmaksızın hiçbir zaman farklılaşma olmaz. Derlenmiş program 16 bayt yığın alanı tahsis eder ve "ok" 16 bit değerini ilk 2 bayta kopyalar. Başlatılmamış 3. bayt, şans eseri '\ 0'. Varsa blah, 16. baytta ve hala dizgeyi sonlandırmıyordur.
kernigh

2

~ - ~!

Bu muhtemelen en aptalca, en bariz olanı.

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

Bu ikinci satır olmadan bir hata veriyor, yazdırıyor y.

ters eğik çizgi bir kaçış karakteri değil, hehe.


Dil adını nasıl telaffuz edersiniz?

8
@professorfish~-~!
Timtech

1
@professorfish Bu "yorum yok" olurdu.
cjfaure

1

Windows Toplu İşi

Bu, 1'den 10'a kadar olan sayıları her biri için boş bir satırla basan bir toplu iş dosyasıdır:

@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

Bu, bir değişkenin içine yeni bir çizgiyi saklamak için kirli bir kesimi kullanır (gecikmeli açılımların kullanımı, bağlantılı cevaptaki daha korkunç görünen NL çizgisinden kurtulur). Yorumun üstündeki tamamen işe yaramaz görünen iki boş satırı kaldırır veya başka bir şekilde değiştirirseniz, işe yaramaz.


0

troff

Troff, en güzel metin işleme sistemidir. Belgelerim için kullanıyorum. Kullanıma hazır olması için bir makro sistemi gerektirir ve en ünlüsü msmakro paketidir. Aşağıdaki -msseçenek kodunu klasik seçenekle derleyelim.

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

Üçüncü satır işe yaramaz gözüküyor ve makro paketi olmadan aslında işe yaramaz. Mutlak bir dikey konumlandırma ile iki satırın altında takip edildiğinden, daha önce hiçbir şey yazdırmamak anlamsız görünebilir. Ancak bu görünmez karakter olmadan, dikey konumlamanın bir etkisi olmaz, ancak nedenini açıklayabileceğimden tam olarak emin değilim ( tartışmada bir göz atmak istiyorsanız bu konuya bakın ). Bu yeni kullanıcıyı çılgına çevirir, ancak püf nokta daha çok denenmiş kullanıcıya aşina olmalıdır.

Sadece bilinen pek çok sevilmeyen versiyon olan (yadigarı troff) kontrol ettim, fakat hala GNU trofuyla aynı şekilde çalıştığına eminim.


Güzel, bu da LaTeX'te olur. Boş bir kutu veya benzeri bir şey olmadan, dikey boşluk düzgün çalışmıyor.
orion
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.