Tulis baris dalam program yang terlihat tidak berguna [ditutup]


26

Tulis beberapa program (ukurannya tidak masalah), dan letakkan garis yang terlihat tidak berguna, tetapi sebenarnya tidak - jika dihapus, program akan macet, atau melakukan sesuatu yang salah. Jangan ragu untuk menandai baris yang terlihat tidak digunakan oleh komentar, atau sebutkan deskripsi kode Anda, seperti dalam contoh di bawah ini (tentu saja, dalam contoh ini, baris tersebut sebenarnya tidak diperlukan, itu hanya sebuah contoh).

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

    return 0;
}

Karena ini adalah kontes popularitas, solusi dengan jumlah suara terbanyak menang.


2
Mengapa garis dalam contoh ini diperlukan?
Gari BN

3
@ GariBN Bukan: "dalam contoh ini, saluran sebenarnya tidak diperlukan, itu hanya contoh."
elixenide

9
@EdCottrell Senang tahu ... Saya pikir saya melewatkan beberapa hal mendasar ...
Gari BN

2
Jadi itu sangat dibutuhkan. Sebagai contoh. :-)
Florian F

1
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena tantangan curang tidak lagi pada topik di situs ini. meta.codegolf.stackexchange.com/a/8326/20469
cat

Jawaban:


33

C

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

Tidak akan dikompilasi jika kami menghapus single ;.

EDIT :

Solusi di bawah ini:

Ini terjadi karena casepernyataan hanya label, dan, dengan demikian, harus diikuti oleh pernyataan (yang standar sebut sebagai "specifier untuk tindakan yang akan dilakukan", yang mengesampingkan deklarasi). Untuk mencegah hal ini, kami awali deklarasi dengan pernyataan ;, null . Spesifikasi untuk caselabel dapat ditemukan di sini di halaman 142 (131 dalam dokumen)


4
GCC mengatakan "label hanya bisa menjadi bagian dari pernyataan dan deklarasi bukan pernyataan".
Vortico

1
Saya baru saja digigit oleh ini dalam program saya menulis untuk sekolah.
Kevin - Kembalikan Monica

Ini membuat program nyata terlihat sangat jelek: \.
val berkata Reinstate Monica

23

C / C ++

Hanya beberapa kode yang ditulis dengan gaya pengantar / tutorial ...

Tutorial nr. 2 : membaca angka, melakukan operasi matematika, dan mencetak hasilnya.

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

}

Menghapus garis result = 42;yang pada pandangan pertama terlihat berlebihan, dan, mengingat tujuan yang dinyatakan, benar-benar salah, sebenarnya akan menyebabkan program tidak melakukan apa yang dinyatakan oleh deskripsi.

Mengapa?

Trigraph menyerang lagi! ?? / akan digantikan oleh preprocessor dengan \ , yang pada gilirannya akan menyatukan baris berikutnya ke dalam komentar. The Hasil = 42; menjadi bagian dari komentar, sehingga "menyimpan" jalur pencetakan. Dengan hasil = 42; baris dihapus, baris printf akan ditelan oleh komentar. Beberapa kompiler mungkin memberikan peringatan, atau trigraph mungkin dimatikan sebagai default dan harus diaktifkan agar contoh ini berfungsi. Penyorotan sintaksis mungkin juga mengkhianatinya, tetapi ada kompiler dan IDE di sekitar yang membuat Anda tidak lebih bijaksana.


Setidaknya dalam gcc, Anda harus menentukan bahwa Anda ingin menggunakan trigraph dengan menambahkan tanda ini (-trigraphs). Tanpa ini, gcc membangkitkan peringatan dan mengabaikan trigraph.
Gari BN

4
Yang bagus! Saya senang saya tidak menggulir ke bawah terlalu jauh sebelum mencari tahu. Anda dapat mengubah blockquote Anda menjadi teks spoiler dengan memulainya dengan >!bukan hanya >.
osifrage pelit

@squeamishossifrage: terima kasih, ini adalah niat awal saya, saya >!hanya menggunakan tidak di setiap baris. Saya pikir mereka tidak muncul untuk saya ketika saya menulisnya. Menariknya, pengurai SE tidak
merusaknya

1
Saya tahu sesuatu yang licik sedang terjadi ketika saya melihat sebuah "stdio.h"perpustakaan lokal dan bukan perpustakaan yang sebenarnya,<stdio.h>
Braden Best

1
Saat saya melihat komentar berlebihan saya berkata dengan keras, "Di mana trigraph itu? Harus ada trigrap - Ah, itu dia."
kucing

19

Ruang putih

Sayangnya saya tidak dapat menampilkan program saya di sini karena StackExchange menghapus semua spasi spasi. Hal yang sama berlaku untuk pastebin.com dan pastie.org, jadi saya juga tidak dapat menautkannya.

Tentu saja, seluruh program “terlihat tidak berguna”, tetapi jika Anda menghapus baris apa pun, itu akan melakukan sesuatu yang berbeda.


41
Tapi untungnya tidak ada yang berharga yang akan hilang, karena seluruh bahasa tidak berguna :-)
squeamish ossifrage

1
@Timwi bagaimana dengan kotak "data rekatkan data"?
Braden Best

1
@ Timwi Saya baru saja mengujinya di sini , dan saya mengerti maksud Anda. Tetapi jika Anda meletakkan teks non-spasi, itu akan mengirimkan, dan data tempel mentah akan tersentuh. Misalnya Anda bisa memasukkan baris tambahan yang mengatakan "Salin data tempel mentah dan hapus baris ini"
Braden Best

8
ganti \ t dengan t. Ganti "" dengan s, ganti \ n dengan n
Cruncher

7
Prank terbaik yang pernah ada: Posting sesuatu tanpa benar-benar menulis kode.
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);

Alasan kerjanya adalah karena tubuh foris b+-, bukan b++atau b--; karena itu, jika Anda menghapus baris yang diperlukan, itu akan menambah bnilai -alert(a).


"itu akan menambah bnilai alert(a)": Jadi, tidak seharusnya b+-menjadi b+=?
Gaurang Tandon

@ GaurangTandon No; idenya adalah seperti b++atau b--.
Sikat gigi

apa arti b + - sebenarnya?
Mhmd

5
@ user689 b + -2 + 2. Itu sebabnya jika Anda menghapus baris dengan 2 + 2;, itu dievaluasi untuk b + -alert(a);.
Sikat gigi

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

Jika Anda menghapus baris i = i;maka kode tidak akan berfungsi. Hal ini karena...

... Bahkan itu tidak akan dikompilasi. Menurut standar C, label seperti lewati pada contoh di atas harus dikaitkan dengan pernyataan. Bahkan titik koma tunggal sudah mencukupi, tetapi jika Anda menghapus seluruh baris maka label tidak memiliki pernyataan terkait dan kompilasi gagal. Jawaban ini menjelaskan sedikit lebih detail.


7

APL

Inilah fungsi APL:

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

Itu melakukan hal yang sama seperti monadik 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

Ini dapat mengambil argumen kiri opsional yang memberikan offset:

      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

Baris ⍺←⎕IO ⋄ ⎕IO←⍺terlihat tidak berguna ("tetapkan ⎕IOke , kemudian tetapkan ke ⎕IO"), tetapi bagian pertama hanya berjalan jika tidak ada argumen kiri yang diberikan, jadi sebenarnya ia melakukan sesuatu:

  • jika tidak diberikan, setel ke (global) ⎕IO.
  • setel (lokal) ⎕IOke

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

Variabel fiboharus ditetapkan sebelum Anda dapat menggunakannya di dalam lambda, bahkan jika Anda menugaskan lambda fiboitu untuk dirinya sendiri. Jika Anda menghapus tugas (yang tampaknya tidak berguna), kesalahan kompiler akan terjadi ("Penggunaan variabel lokal 'fibo'").


Ini bukan pengecualian referensi nol, ini merupakan kesalahan penyusun variabel yang tidak diinisialisasi. Juga, lebih baik pindahkan deklarasi ke jalurnya sendiri, karena deklarasi itu tidak sia-sia.
Kendall Frey

@KendallFrey Poin bagus! Tetap.
Ben Reich

5

Windows Batch:

echo hello
pause
echo world

Atur program berjalan dan modifikasi file ke:

rem test01
pause
echo hello world

Jika Anda menghapus atau mengubah ukuran komentar, itu akan menyebabkan malapetaka ketika instance pertama dari program tersebut berhenti dan kemudian melanjutkan interpretasi dari byte ke 19 dan seterusnya.


Saya tidak melihat komentar.
orion

4
REM (komentar) adalah operator komentar - stackoverflow.com/questions/11269338
OJW

4

Jawa

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

Ini adalah program kerja yang mengambil halaman web dari URL. Anda mungkin terkejut dengan kalimat itu

            http://codegolf.stackexchange.com

mengkompilasi bahkan tanpa peringatan. Bahkan, program tidak dapat dikompilasi tanpa itu.

Ini sebenarnya sebuah label http:,, diikuti oleh komentar //codegolf...,. Label berlaku untuk sementara dan digunakan dalam break http;pernyataan.


1
Tolong, beberapa penjelasan, atau saya akan menghapus kalimat apa pun yang Anda katakan.
Bill Woodger

3

Rubi

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

Hal serupa muncul di tempat kerja baru-baru ini - seorang rekan kerja sebenarnya menandai inisialisasi saya yang tampaknya tidak perlu selama peninjauan kode, dan saya benar-benar tergoda untuk memasukkan penjelasan di dalam blok spoiler. Jadi saya akan melakukannya di sini.

Baris ini diperlukan karena variabel yang diinisialisasi di dalam blok adalah lokal untuk blok itu. Jika kami menginisialisasi di luar blok, maka nilainya dapat melarikan diri ke ruang lingkup metode.

Output seperti:

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

Output dengan baris pertama dari metode dihapus:

variabel atau metode lokal yang tidak ditentukan `cocok 'untuk utama: Objek (NameError)


1
Sudah cukup jelas mengapa itu diperlukan ... dan lagi pula, cara yang lebih baik untuk menulis ini hanyamatch = Prime.find { |n| n.to_s[regexp] }
Doorknob

1
Itu tidak akan melakukan apa yang saya inginkan ... Prime.findkembali n(mis. 223), dan matchperlu n.to_s[regexp](mis. "22"). Jelas saya membuat masalah untuk membuatnya perlu.
histokrat

Ah, maaf, tidak melihat Anda memanggil findpada Primedan bukan array. Pokoknya, masih cukup mudah untuk memperhatikan mengapa garis itu diperlukan ...
Gagang Pintu

Cukup adil. Mungkin rekan kerja saya hanya tidak patuh.
histokrat

Hah. Tidak ada deklarasi variabel, tetapi pendekatan sebaliknya untuk default lokal / nonlokal dengan apa yang Python lakukan. Itu akan terasa aneh jika saya memutuskan untuk belajar Ruby.
user2357112 mendukung 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    

Di sini, \n//This is a commentperlu. Tanpanya kode tidak akan berjalan.

Setidaknya diperlukan \nchar setelah EOT;menjalankannya dengan benar


3

JAVASCRIPT

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

; // This must be here

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

Tanpa titik koma kemudian aakan menjadi apa yang pernah nilai kembali dari fungsi-2 adalah - dalam hal ini itu undefined. Karena fungsi yang awalnya ditugaskan aakan dieksekusi segera dengan fungsi kedua sebagai argumen b.


2

COBOL (IBM Mainframe)

   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 
       . 

Jika Anda menjalankan program di atas (setiap IBM Mainframe COBOL sejak COBOL II (kompiler IBM pertama hingga standar 1985, mungkin juga COBOL IBM lainnya) hasilnya adalah:

02/22/14 13.11.02 HELLO WORLD!

Namun, jika Anda menghapus baris tidak berguna yang tidak berguna "PINDAHKAN RUANG KE W-SAAT DICAMPUR." (bidang memiliki nilai awal ruang, dan memiliki konten lain yang ditempatkan di dalamnya dalam instruksi berikutnya, dan itu bercabang pula) program tidak menghasilkan output dan benar-benar Abends (U4038) (yang berarti crash) dengan pesan berikut :

 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. 

(kode pesan dan teks akan bervariasi di antara kompiler, offset tergantung pada kompiler yang sebenarnya digunakan dan kompilasi opsi, alamat tergantung di mana program dimuat ketika DIKECUALIKAN).

Alasannya adalah NEXT SENTENCE. Ini adalah Secret GO TO. Compiler memburu full-stop / periode berikutnya dalam sumber, dan menghasilkan cabang dengan instruksi berikut. Dari COBOL II, penggunaan full-stop / menstruasi menjadi santai. Suatu program harus diakhiri dengan periode penuh. Dalam hal ini, cabang tidak aktif pada akhir program.

Kedua program mengkompilasi 100% bersih (tidak ada pesan diagnostik, Kode Pengembalian nol).

Perilaku ini adalah "IBM Extension" yang bodoh untuk COBOL. Standar 1985 tidak mengizinkan NEXT SENTENCEdalam IF/ END-IF( CONTINUEdigunakan sebagai gantinya, yang merupakan no-op). IBM mengizinkannya - menyebabkan Gotcha mengerikan dari waktu ke waktu.


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

Masalah string overflow sederhana.


1
Setiap kompiler yang layak akan memberi Anda diagnostik "terlalu banyak inisialisasi".
Ben Voigt

Segfault platform mana yang tidak blah? Di sini dengan OpenBSD 5.5 / amd64 dan sistem gcc, ia tidak pernah segfault, apakah ada atau tidak blah. Program yang dikompilasi mengalokasikan 16 byte ruang stack dan menyalin nilai 16-bit dari "ok" ke 2 byte pertama. Byte ketiga yang tidak diinisialisasi memiliki '\ 0' secara kebetulan. Jika blahada, itu dalam byte ke-16, dan masih belum mengakhiri string.
kernigh

2

~ - ~!

Ini mungkin yang paling bodoh, paling jelas di sini.

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

Itu melempar kesalahan tanpa baris kedua, dengan itu mencetak y.

backslash bukan karakter pelarian, hehe.


Bagaimana Anda mengucapkan nama bahasa?

8
@professorfish~-~!
Timtech

1
@professorfish Itu akan menjadi "no comment".
cjfaure

1

Windows Batch

Ini adalah file batch yang mencetak angka 1 hingga 10 dengan baris kosong setelah masing-masing:

@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

Ini secara efektif menggunakan peretasan kotor untuk menyimpan baris baru di dalam suatu variabel (penggunaan ekspansi yang tertunda menghilangkan garis NL yang tampak lebih menakutkan dalam jawaban yang ditautkan). Jika Anda menghapus atau mengubah dua baris kosong yang sama sekali tidak berguna di atas komentar, well, itu tidak akan berfungsi.


0

troff

Troff adalah sistem pemrosesan teks yang paling indah. Saya menggunakannya untuk dokumen saya. Ini membutuhkan sistem makro agar siap digunakan, dan yang paling terkenal adalah mspaket makro. Mari kita mengkompilasi potongan kode berikut dengan -msopsi klasik .

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

Baris ketiga tampaknya tidak berguna, dan sebenarnya tidak akan berguna tanpa paket makro. Karena diikuti dua baris di bawah ini dengan posisi vertikal absolut, sepertinya tidak ada artinya untuk mencetak apa pun sebelumnya. Tetapi tanpa karakter yang tidak terlihat ini, posisi vertikal tidak akan berpengaruh, meskipun saya tidak yakin saya bisa menjelaskan mengapa (lihat utas ini jika Anda ingin melihat diskusi). Ini membuat pengguna baru menjadi gila, tetapi triknya akan menjadi biasa bagi pengguna yang lebih bereksperimen.

Hanya memeriksa dengan versi favorit saya troff yang tidak terlalu dikenal (heirloom troff), tapi saya cukup yakin itu masih berfungsi sama dengan GNU troff.


Bagus, ini juga terjadi di LaTeX. Tanpa kotak kosong atau yang serupa, jarak vertikal tidak berfungsi dengan baik.
orion
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.