뭐? 오류가 없습니까? [닫은]


197

당신의 작업은 간단합니다. 컴파일하거나 실행할 때 언뜻보기에 오류가 발생하지만 관련되지 않은 다른 오류는 발생하지 않는 프로그램을 작성하십시오. 이것은 인기 콘테스트이므로 창의력을 발휘하십시오.


11
흠 .... 이것은 뇌 맛보기입니다. +1
Tim Seguine

1
"만약 if if = then then = else else = if then else ..."(PL / I를 사용하여 허용 된 경우)의 행을 따라 문장을 포함하는 오래된 PL / I 예제가있었습니다. 키워드를 변수 이름으로 사용하고 C의? :와 비슷한 조건식을 가졌으며 if / then / else 키워드도 사용했습니다 ...)
keshlam

8
BF 코드 는 컴파일되지 않는 것처럼 보이기 때문에 전체 brainfuck 언어를 제안합니다 .
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
나는 방망이에서 첫 번째 대답이 바로 인스 타원처럼 느낀다.
temporary_user_name

1
C99에서도 유효합니다.
R ..

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 

"아무것도 볼 수 없습니다"를 인쇄합니다.

그건 ELSIF 하지 ELSEIF . (그리고하지 확실히의 ELIF 인터프리터에 그래서 - 제멋대로 파이썬 프로그래머 (나) 화있을 진저!) ELSEIF는 일반 메소드 호출과 같은, 우리가 X <0 블록을 입력하지 않기 때문에, 우리는 바로 갈 사람 과 예외를 제기하지 마십시오. 이 버그는 모든 구문 강조 환경에서 엄청나게 명백합니다. 고맙게도 (?) 코드 골프는 그러한 환경이 아닙니다.


5
당신은 저를 얻었다. 나는 전에 파이썬과 루아를 모두 해왔고 이제 루비부터 시작했습니다. 루아는 그 중 하나를 사용합니다.
Riking

7
우주의 의미는 볼 수 없습니까?
user80551


77

씨?

여기에 꽤 정상적인 코드는 ...

void main() = main--;

C가 아닌 Haskell입니다. 두 개의 인수를받는 "void"라는 함수를 정의합니다. 첫 번째 이름은 "main"이고 두 번째 (이름이없는)가 빈 튜플이면 "main"변수를 반환합니다. "-"는 Haskell에서 주석을 시작하므로 ";" 주석 처리되었습니다.


21
다시 말해서, 그것은 속임수입니까?
Mr Lister

75
부정 행위는 코드 도전 경쟁에서 일반적입니다. 우리는 그것을 창의성이라고 부릅니다. : P
Joe Z.

31
나는 이것을 창의성이 아니라 부정 행위라고 부릅니다. 일부 코드의 오류 여부를 고려하기 전에 실행중인 환경을 정의해야합니다. 그렇지 않으면 Malbolge 인 라인 노이즈를 줄 수 있고 컴파일되는지 묻습니다.
Tim S.

5
당신이 잠시 중단하고 갈 수 있도록하기로했다 '이봐 당신이 수 것을?' :)
intx13

10
@JoeZ. 그것은 수있는 경우에 펄처럼 보인다.
user80551

72

자바 스크립트

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

작동 방식은 다음과 같습니다.

첫 번째 a는 실제로는 а(즉, Cryllic Unicode "a")입니다.


8
이 트릭은 유니 코드 토큰 (예 : Java, C #)을 허용하는 모든 언어에 적용 할 수 있습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, 귀하의 사용자 이름으로 예시
TheDoctor

9
너무 명백한 해결책
thepirat000

6
전에 그것을 본 적이있는 사람에게는 너무 분명합니다. 나는 많은 초보자들과 소위 "웹 전문가들"이 넘어 질지도 모른다고 확신한다.
Thebluefish

42
분명한? 따라서 변수 이름은 항상 모양이 아닌 유니 코드 번호를 통해 보입니까? "a"(또는 "а"?)를 검색하고 예상 한 것을 찾지 못하면이를 알 수 있지만 단순히 읽을 때 볼 수는 없습니다 (적어도 여기에 표시된 글꼴).
Tim S.

70

자바 스크립트

다음 코드를 제공 할 때 "오타 여야합니다! 어떻게 작동합니까?" .

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

아래 설명 은 최근 사례 중 하나에서 정확히 복사 한 것입니다 .

아시다시피 JavaScript에서 리터럴을 제외한 모든 것은 객체입니다. 숫자도 객체입니다. 그래서 이론적으로 (실제적으로) 당신은 속성을 얻거나 당신이 같은 점 표기법을 통해 비 문자의 메소드를 호출 할 수있다 'string'.length[1,2,3].pop(). 숫자의 경우 동일한 작업을 수행 할 수 있지만 단일 점 뒤에 파서는 부동 소수점 값 ()을 기대하는 숫자의 소수 부분을 찾습니다 123.45. 정수를 사용하는 경우 분수 부분이 비어 있음을 파서에 알리고 속성을 지정하기 전에 추가 점을 설정해야합니다 123..method().


18
루아 사람으로서, 나는 기대했다422
mniip

3
이전에이 사용법을 보지 못했지만 매우 깔끔합니다.
Nit

5
받는 사람 완벽하게 사용하고 나쁜 기분 ..에 관한 표기하지만, 완전히 우둔 .toString(a freaking argument here?)표기 : 잘 P 오 : 지금 그것을 알아 냈다
데이비드 멀더에게

이 결과는 무엇입니까? 그리고 왜 ? 궁금합니다.
Nicolas Barbulesco

3
게으른 경우 인수는 기본을 지정하므로 (이진수로 42를 인쇄합니다)이 코드에는 전혀 중요하지 않습니다. ..혼란스러운 부분입니다.
Kat

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루프 로 인해 지속적인 포크 폭탄으로 인한 일반적인 오류 메시지가 나타날 수 있습니다 . 포크 폭탄이 없습니다.

  • bash가 블록 maybe내에서 누락 된 명령 또는 전체 구문 오류 에 대해 불평 할 수 있습니다 if. 그렇지 않습니다.

  • 스크립트 생성 할 수 있는 유일한 오류 메시지는로 끝납니다 2: No such file or directory.

설명

  • [bash에는 특별하지 않으므로 < 2평소처럼 리디렉션을 수행합니다. 2현재 디렉토리에 이름 을 가진 파일이 없으면 오류가 발생합니다.

  • 위의 오류로 인해 before 명령 &&은 0이 아닌 종료 상태를 가지며 exit실행되지 않습니다.

  • for루프는 무한이 아니다. 실제로 루프는 전혀 없습니다. bash는 64의 2의 거듭 제곱을 계산할 수 없으므로 산술 연산 결과는 0입니다.

  • [[ false ]]falsenull 문자열 인지 테스트 합니다. 그렇지 while않으므로이 루프는 무한합니다.

  • 위의 if문으로 인해 명령문이 실행되지 않으므로 오류가 감지되지 않습니다.


55

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

출처 및 설명 : https://stackoverflow.com/questions/11695110


137
Perl 프로그램은 일반적으로 오류처럼 보입니다.
ugoren

1
@ugoren Perl에 대한 지식이 거의없는 사람들이 읽고 쓸 때만 가능합니다.
TLP

8
당신은 @ugoren의 의견이 답보다 두 배나 많은 공감대를 가지고 있다는 것을 좋아합니다 :)
yo '

2
Windows 쉘 트릭을 생각 나게합니다. "만약 당신이 행복하고 그것을 알고 있다면, 구문 오류!"
Jwosty

47

자바

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

여기에 스택 오버플로가 없습니다. 를 따라 이동.

언뜻보기에을 생성해야 StackOverflowError하지만 그렇지 않습니다! 그것은 실제로 영원히 실행됩니다 (적어도 모든 실제적인 목적을 위해, 기술적으로 그것은 우주의 나이보다 몇 배나 더 긴 시간이 지나면 끝날 것입니다). 이것이 어떻게 / 왜 작동하는지 알고 싶다면 이것을 참조 하십시오 . 또한 main()주 메소드가 일반적으로 String[]인수 가 필요할 때 인수없이 호출 할 수있는 이유를 궁금해하는 경우 여기에서 변수 인수로 선언했기 때문에 완벽하게 유효합니다.


3
당신이 연결 한 질문이 설명 하듯이, 그것은 무한정 실행되지 않고 대신 매우 오랫동안 실행됩니다.
Kevin

1
@Kevin 불필요하게 pedantic하지 말자. "우주의 시대보다 길다"는 모든 실제적인 목적을 위해 "영원히"입니다.
arshajii

8
"시스템에 스택 오버플로 없음"이라고 말하면 실제로 시스템에서 스택 오버플로가 계속 발생하고 결국 스택 오버플로 예외가 발생합니다. (당신이 언급했듯이, 결국 매우 긴 시간이 될 수 있습니다) 그리고 그것은 스택 깊이에 달려 있습니다. 더 작은 VM 또는 임베디드 시스템에서 스택 깊이는 훨씬 더 작을 수 있습니다.
McKay

@McKay 그 진술은 분명히 단순한 무시할 줄입니다. OP는 오류가 발생하는 것처럼 보이지만 그렇지 않은 프로그램을 요구합니다. 일반적인 경우 위의 답변이이 요구 사항을 충족합니다. 분명하지 않은 모호한 상황을 해결할 수는 있지만 대답이 무효화되지는 않습니다. 나는 당신이 당신의 downvote를 재고하기를 바랍니다.
arshajii

3
@McKay 그건 그렇고, 스택 크기 작다고 가정하고 (예를 들어, 보통 ~ 10,000과 대조적으로 100) 초당 10,000,000 번 호출 할 수 있습니다 . 그런 다음 총 실행 시간은 4,019,693,684,133,147 년으로 나옵니다. 여전히 우주의 나이보다 훨씬 많은 크기입니다.
arshajii

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를 방문하십시오 . % 20why % 20it % 20would % 3F .


36

VBScript

&VBScript 의 연산자는 문자열 연결이지만 지구상에서 &&and &&&연산자는 무엇입니까? (VBScript의 "and"연산자는이 And아니라는 것을 기억하십시오 &&.)

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

그 프로그램 조각은 합법적 인 VBScript입니다. 왜? 그리고 가치는 x무엇입니까?

어휘 분석기는 이것을로 분류한다 x = 10 & 987 & &654& & &321. 로 시작하는 정수 리터럴 &은 기 묘하게도 8 진 리터럴입니다. 끝나는 8 진 리터럴 &은 더 기괴하게 긴 정수입니다. 따라서 x의 값은 4 개의 정수의 10 진수 값의 연결입니다 10987428209.


8
그저 ... 와우
primo

27

목표 -C

큰 문제는 아니지만 주석 안에 링크를 넣으려고하면 놀랐습니다.

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

http는 여기에 코드 레이블이며 그러한 레이블은 goto 지침에 사용됩니다.


8
//주석 을 지원하는 C와 같은 언어로 작동해야합니다 .
Ilmari Karonen

그래, 아마, 나는 게시하는 동안 확실하지 않았다
Piotr

14
그러나 범위 당 프로토콜 당 하나의 URL을 제한하십시오.
Ben Voigt

1
동일한 범위에서 여전히 https : //를 사용할 수 있습니다.
Florian F

25

씨#

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Bar메서드 는를 수행하기 때문에 yield실제로 호출 될 때 메서드가 실행되지 않으므로 반복 될 때 메서드를 실행하는 열거자를 반환합니다.


마침내 ... 여기 FOO와 BAR이 있습니다 :)
VVK

1
그것은 실제로 중요하지 않은 것들의 이름에 대한 foo와 bar입니다.
McKay

22

main=195;

x86 플랫폼에서 작동하며 여기서 195는 ret의 opcode입니다. 아무것도하지 않습니다.


ret의 opcode는 193이 아닌 195입니다.
Dennis

나를 위해 작동하지 않습니다. 주소 195
에서이

Tbanks @Dennis, 코드가 정확하고 설명이 잘못되었습니다.
ugoren

3
(를 포함한 모든 플랫폼에서 현대 페이지는 실행되지 않고 읽을 수 있습니다 86)이하는 항목에 충돌합니다 main때문에 main실행하지 않은 데이터 세그먼트에 배치되었습니다. 재미있게, const int main=195수 없습니다 (x86에서) 충돌 (그러나 쓰레기 종료 상태를 생성합니다) 때문에 .rodata기본적으로 같은 세그먼트에 넣어 .text때문에 실행 파일입니다. ( const char main[]="1\300\303";성공적으로 종료됩니다! (여전히 x86))
zwol

2
나는 64 비트 컴퓨터에 있고 (이것이 아무것도 바뀌지 않을지 모르겠다) main = 195는 segfault를 제공하지만 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
원래 질문을 다시 읽어야한다고 생각합니다. "또는 다른 관련없는 오류가 발생합니다."
Tom Verelst

실제로,가 없으면 \u000d정의되지 않은 value에 대한 참조를 사용합니다 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';
}

왜?

NULLintergal 상수이므로 int과부하보다 엄격하게 오버로드 와 일치합니다 int*. 여전히 대부분의 프로그래머는 NULL포인터와 연관되어 있으므로 널 포인터 역 참조가 예상 될 수 있습니다.


11
다행히, C ++ (11)는 구현 정의 할 수 있습니다 NULLnullptr하고, (아직 내가 아는 어느 것도 있지만, 내가 그들을 기대) 그렇게하지 구현은 예상 세그먼트 오류를 줄 것이다.
hvd

16

파이썬

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

완벽하게 유효하지만 출력을 추측하기는 어렵습니다. 처음 3 "문자는 여러 줄 문자열을 시작하고 다음 2 개는 문자열의 일부입니다. 끝 부분에서 처음 3"은 문자열을 종료하고 마지막 두 "는 빈 줄 리터럴로, 파서가 여러 줄 문자열에 연결합니다. .


20
보너스 : print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski

15

자바 스크립트

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

작동 방식 :

JS에는 양의 음의 무한대가 있으며 0으로 나누는 오류는 없습니다.


2
NaN으로 몇 가지 트릭도 할 수 있어야합니다.
intx13

8
meh, 이것은 수레가있는 모든 언어에서 발생합니다.
Navin

3
@Navin : 0으로 나누기가 오류를 일으키지 않는 수레가있는 모든 언어.
nwk

2
@nwk floats의 IEEE 표준에 따르면 0으로 나누기는 inf 여야합니다. 나는 이것을 바꾸는 어떤 언어도 모른다.
Navin

1
IEEE 754는 신호 NaN / Inf (FP 0 나누기 예외, -1의 제곱근, 언더 플로 / 오버플로 등)와 비 시그널링 ( 잘 정의 된 수학으로 일반 대수 값 을 처리 NaN/ 정의)하는 두 가지 모델을 지정합니다. Inf그들에). 최신 FP 하드웨어는 두 가지 방식으로 작동하도록 구성 할 수 있습니다. 언어에 구애받지 않음; 모르는 수치심.
ulidtko

14

C ++

trigraphs와 space-less lambda를 섞는 것은 상당히 혼란스럽고 trigraph를 모르는 사람들에게는 분명히 잘못 보일 수 있습니다.

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

작동 방식 :

??로 시작하는 3 개의 기호로 구성된 일부 시퀀스를 trigraphs라고하며 완전히 호환되는 전처리기로 대체됩니다. 전처리 된 해당 행은 다음과 같습니다. return ~ [] () {return "\ x00FF"; } () [0]; 보시다시피, 이것은 0xFFth 문자로 구성된 문자열을 반환하는 불필요한 람다 함수에 지나지 않습니다. [0] 그냥 문자를 추출하고 ~ NOT으로 그것을 때문에 0이 반환됩니다.


12
유효한 C ++ 프로그램 int main(){(([](){})());}은 또한 trigraphed 때 멋지게 보일 수 있습니다 ...
Angew

1
저것은 무엇을 하는가?
Joe Z.

1
@Joe Z [](){}[](int a){return a+1;}하나 처럼 람다 함수 입니다. 내가 실수하지 않으면 ([](){})()반환하는 함수를 호출합니다 void. (([](){})());그런 다음 전체가 으로 요약됩니다 (void);. 이는 아무것도하지 않는 진술입니다. main그런 다음 return명령문 이 없어야하는 것처럼 0을 반환합니다 .
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

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

    Debug.Print 1 / UBound(x)

End Sub

빈 쉼표로 구분 된 문자열을 나누면 빈 배열이 제공됩니다. 제로 에러에 의한 명백한 나눗셈이 맞습니까?

아니. 놀랍게도, 길이가 0 인 문자열이 분할되면 런타임은 하한이 0이고 상한이 -1 인 배열을 제공합니다. 위의 코드는 -1을 출력합니다.


@minitech 실제로, 빈 배열을 UBound에 전달하면 첨자 범위를 벗어난 오류가 발생합니다.
Comintern

… 잘. 다시 가져갑니다. VBA = /
Ry-

1
@ 미니 테크 VB6에서 Split의 원래 구현에 버그가 있음을 이해합니다. .NET에서는 의도적으로이 핵을 이용하는 모든 VB6 코드와의 호환성을 유지하기 위해 빈 배열의 동작을 -1의 UBound를 반환하는 동작을 "추가"했거나 문서화 한 것이 좋습니다. 널 문자열을 분할하는 것이 Windows API 호출없이 VBA / VB6에서 기본적으로이 배열을 얻는 유일한 방법입니다.
Comintern

12

자바 스크립트

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

제공합니다 : 5

그런데, ...한데:

5.toString();

SyntaxError를 제공합니다

작동 방식 :

JavaScript는 숫자의 점을 부동 소수점 리터럴로 구문 분석하려고합니다.


13
내가 한 시간 후에 했던 것과 똑같은 사건 을 어떻게 게시 습니까?
VisioN

1
이봐, 미안하지만 대답을 확인하지 않았습니다. 또한 공간이있는 사례를 추가했습니다. 나는 이것을 자바 스크립트 가든에서 한 번 읽었습니다.
Sumeet Kashyap

1
수메, 죄송합니다. 귀하의 답변은 @VisioN의 답변보다 훨씬 좋고 명확합니다.
Nicolas Barbulesco

12

HTML

여기에 첫 번째 게시물, 나는 이것을 얻었는지 확실하지 않지만 여기에 간다.

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

그것은 A의 .html파일 ...


9
따라서 트릭은 파일에 .html확장자가 있고 웹 서버가 .html파일을 PHP 로 구문 분석하도록 구성되지 않았기 때문에 PHP 블록을 실행하지 않는다는 것입니다 .
VisioN

5
예. 이게 부정 행위인가요? @VisioN
Albzi

2
나는 이것이 속임수라고 확신합니다. 최소한 "HTML"을 굵게 표시하십시오.
Navin

좋아요! :-) 트릭은 저에게 효과적이었습니다.
Nicolas Barbulesco

1
나는 어떤 언어로 쓰여 졌는지 명확히하기 위해 편집했다
vijrox

9

PHP (40 바이트)

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

이것이 내가이 질문에 준 답입니다 : 광기 검사 프로그램

아이디어는 오류를 생성하는 코드를 만드는 것이 었습니다.

우리가 생각할 첫 번째 오류는 구문 오류입니다.

구문 오류가 없습니다 ...

다른 것은 클래스 / 함수가 존재하지 않는 것입니다.

그렇게 멀리 달리지 않습니다 ...

다른 하나는 시간 초과 또는 메모리 오버플로 일 수 있지만 다시는 그다지 도달하지 않습니다 ...

http://writecodeonline.com/php/ 에서 코드를 테스트 하십시오 ( <?테스트를 시작하려면 제거하십시오 ).


3
이것은 인기 콘테스트입니다. 바이트를 절약하기 위해 ur 코드를 압축 할 필요가 없습니다. 가독성을 높이기 위해 다시 포맷하십시오.;
Songo

나중에 읽을 수있는 버전을 추가하겠습니다. 나는 똑같은 대답을 사용했고 전혀 편집하지 않았습니다.
Ismael Miguel

foreach(e()as&$e);이 솔루션의 핵심입니다. e()바로가는 문법 검사기를 유지하는 것입니다 &$e(가) 후 as실패 원인이 무엇인가.
생성자

실제로 모든 것이 중요한 역할을합니다.
Ismael Miguel

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 프로그램 중 하나에이 코드 줄이 있다는 사실을 발견했으며, 소스 코드를 변경하지 않기로 버그를 수정했습니다.


VB6에서 유효하지 않은 VBS 코드를 작성하는 것을 제외하고 버그를 수정하지 않은 상태로 두는 데 단점이 있습니까?
Gabe

1
@Gabe : 아니요. VBScript 코드를 VB로 포팅하는 것이 어려운 점 외에는 단점이 없습니다.
Eric Lippert

1
이름 ! 이 뉴스 조직은 누구입니까?
Nicolas Barbulesco

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

이것은 널 포인터를 역 참조하기 때문에 분명히 segfault입니다.

잘못되었습니다-실제로 루프 조건이 하나씩 해제되어 무한 루프입니다. 접두사 감소로 인해 i1023에서 -1로 실행됩니다. 이는 할당이의 모든 요소 arr뿐만 아니라 바로 앞에있는 메모리 위치도 덮어 쓰는 것을 의미합니다 i. 에 도달 -1하면 i자신을 덮어 쓰므로 0루프 조건이 다시 충족됩니다 ...

이것은 더 이상 재현 할 수없는 원래 변형이었습니다.

같은 일이 i0에서 위로 올라가고 1 씩 줄어 들었습니다. 항상 최신 GCC는 저장 i전에 arr메모리에; 이전 버전에서는 달라야합니다 (선언 순서에 따라 다름). 배열을 다루는 첫 번째 장난감 프로그램 중 하나에서 생성 된 실제 오류였습니다.

또한 C에서 포인터가 작동하는 방식을 알고 있다면 분명하지만, 그렇지 않으면 놀랍습니다.

할당이 (--i)[arr]오류를 발생 시키는 것으로 생각할 수 있지만 유효하고에 해당합니다 arr[--i]. 표현식 a[x]은 단지 *(a + x)색인화 된 요소에 대한 포인터를 계산하고 역 참조하는 구문 설탕입니다 . 물론 추가는 정식 적이며 따라서 동등하다 *(x + a).


1
내가 볼 수있는 한, 루프 본문은 절대로 실행되어서는 안됩니다 (1234 <= 0은 false로 평가되기 때문에). "> ="를 쓰려고 했습니까?
celtschk

1
@celtschk 네, 오타였습니다. 알아 주셔서 감사합니다!
l4mpi

이 메모리 정렬이 실제로 지정되었거나 일부 컴파일러에서이 방법으로 구현 되었습니까?
Paŭlo Ebermann

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 나누기가 WOULD에서 ArithmeticException을 발생 시키기 때문에 0 / 0 == 0 / 0이면 작동하지 않습니다 .


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 문은 함수에 대한 참조를 가져 오지만 (괄호는 필요하지 않음) :)매개 변수 로 smiley 를 사용하여 호출합니다 .


1
너무 많은 찡그림 얼굴 :(
Joe Z.

8

씨#

실제로 나는 실수로 그 일을 실수로 저지른 적이 :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

던지다 반환 하지 않습니다 .


하하, 사이트에 오신 것을 환영합니다! 첫 번째 게시물로서의 용기에 대한 명성. :)
Jonathan Van Matre 2014 년

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*/a = 0 앞에 열린 주석의 종결 점으로 주석 처리 된 코드 에 의존합니다 . 0x000d에 대한 정수 ab에 대한 설명은 개행을 숨겨 다음 행의 주석을 활성화합니다.


1
지금 당장은 할 수 없지만 가능하면 다시 포맷하면 좋을 것입니다. 그것은 ... 그대로 읽을 조금 어렵습니다 : P
Jwosty

더 분명하게했다; 스포일러 태그는 트릭이 처음에는 분명하지
않게

2
잠깐, 첫 번째는 실제로 오류를 생성합니까? 그것은 질문이 요구하는 것과 반대입니다. 왜 두 번째로 System.exit (1)을 사용하지 않습니까?
Riking

3
자바 프로그래머는 두 번째 스 니펫에서 스택 오버플로를 기대하지 않습니다. 미안하지만, 너무 명백하다.
Tobias

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
읽기 어렵지만 사람들이 어떤 종류의 오류를 기대하는지 모르겠습니다.
Bryan Chen

3
나는 사람들에게 타당하지만 틀에 박힌 표기법을 상기시키고 싶었다. 나는 이것이 유효하다고 말하기 전에 확실히 세 번을 보았습니다. 우선, 5 [string]과 같은 표현식은 일반적인 코더에게 잘 알려져 있지 않으며 배열 인덱싱의 논리를 무시합니다. 둘째, ''+ string은 2 개의 문자열을 추가하는 것처럼 보이지만 따옴표 유형이 잘못되었습니다. 셋째로, & i ++는 정수의 주소처럼 보입니다 (그러나 우선 순위가이를 처리합니다). 마지막으로, 우리는 문자열 리터럴을 넘어서고 있지만 더 큰 백킹 버퍼를 넘어서는 안됩니다.
오리온

나쁘지 않은 것 같습니다. 나는 C ++로 조금 코딩했지만 이것을 알아낼 수 있습니다.
Navin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.