이상한 언어 기능


974

당신의 의견으로는, 당신이 경험 한 가장 놀랍고, 이상하고, 이상하거나 정말로 "WTF"언어 기능은 무엇입니까?

답변 당 하나의 기능 만 사용하십시오.


5
@gablin 자바 스크립트 파싱을 사용하여 LISP 구분자를 PERL 정규식과 결합하면 WTF의 90 %를 차지할 것입니다.
Talvi Watia

답변:


1859

C에서는 배열을 다음과 같이 색인화 할 수 있습니다.

a[10]

이것은 매우 일반적입니다.

그러나 덜 알려진 형태 (실제로 작동합니다!)는 다음과 같습니다.

10[a]

이는 위와 동일 함을 의미합니다.


758
왜냐하면 a [10]은 * (a + 10) ...을 의미하고 10 [a]는 * (10 + a)를 의미하기 때문입니다.
Michel Gokan

77
"Hello World"를 잊지 마십시오 [i]. 또는 i [ "Hello World"]
Richard Pennington

167
또는 더 유용하게는 "0123456789abcdef"[x & 0xf]
Dipstick

17
@ frunsi : 항상 예상대로 작동합니다. 포인터 추가는 주소에 대한 간단한 정수 추가와 다릅니다. 문제 의 유형이 어떤 크기인지에 관계없이 정류 적 입니다.
R. Martinho Fernandes 2012 년

12
@mcv-a [10]은 "* (a + 10)"과 같습니다. 여기서 "a + 10"표현은 포인터 산술입니다 (예를 들어 a가 짧기 때문에 예에서 a + 10은 a 's address, 10 shorts, 즉 20 바이트를 이동하십시오 '). "10 +는"인 [A]로 interepreted되는 식 (10) '* (10 + a) ", 또한 포인터 연산과 동일하게 처리된다.
Edan Maor

1292

자바 스크립트에서 :

 '5' + 3 gives '53'

이므로

 '5' - 3 gives 2

81
문자열에 숫자를 추가하기 위해 이러한 종류의 기술을 사용하여 자바 스크립트를 처음 시작했을 때를 기억합니다. "111"-- "222"는 333이지만 "111"+ "222"는 "111222"입니다.
Callum Rogers

112
+문자열 연결이 끔찍합니다
Matteo Riva

416
+ for concat은 문제가되지 않습니다. 타이핑이 약합니다.
FogleBird

270
@FogleBird 어느 쪽도 실제로 문제가 아닙니다. 일관성없는 강제 규칙과이 둘 의 조합 일뿐 입니다.
TM.

70
기본적으로 +는 문자열이 포함될 때 연결됩니다. '123456'-456 = '123'과 같은 코드를 작성할 수없는 이유는 무엇입니까? 흥미로울 것입니다.
Jimmie Lin

872

JavaScript에서 다음 구성

return
{
    id : 1234,
    title : 'Tony the Pony'
};

returnsundefined 는 개행 후의 부적절한 암시 적 세미콜론 삽입으로 인한 구문 오류 return입니다. 그래도 다음과 같이 작동합니다.

return {
    id : 1234,
    title : 'Tony the Pony'
};

더 나쁜 것은, 이것도 잘 작동합니다 (적어도 Chrome에서는).

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

구문 오류가 발생하지 않고 자동으로 실패하는 동일한 문제의 변형이 있습니다.

return
    2 + 2;

225
세미콜론 삽입은 JavaScript에서 가장 악의적 인 부분 중 하나입니다.

230
사용자가 대부분 바보라는 가정하에 언어 기능을 디자인 할 때 항상 문제가 발생합니다.
Rob Van Dam

8
실제로 C # 개발자 인 나는 그 문제를 겪었고, 중괄호를 새로운 줄에 넣었습니다. 문제가 무엇인지 깨달을 시간이 걸렸습니다. 문제를 해결하더라도 답변을 읽을 때까지 문제가 무엇인지 몰랐습니다!
Fedor Hajdu

24
Nick Retallack : JavaScript의 C와 같은 중괄호 및 세미콜론 구문으로 인해 줄 바꿈이 중요한 것은 분명하지 않습니다.
Tamas Czinege

19
JavaScript로 프로그래밍 할 때 C 스타일을 사용하지 않으면 JavaScript 언어 디자이너가 C 스타일 구문을 선택하는 것이 다소 어색했습니다.
Ryan Lundy

795

자바 스크립트 진리표 :

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

출처 : Doug Crockford


237
Javascript에는 === 연산자가 있습니다.
Anonymous

65
그렇다면 ==언어 디자이너의 눈에는 어떤 목적이 있습니까?
Chris S

137
혼란스러운 사람들.
Javier

123
==의 의미가 있다면 좋을 것 입니다 ===. 그런 다음 ~=유형 강제 변환이 허용되는 것과 같은 다른 연산자가 있습니다.
TM.

18
@Otto 사실, 우리가 괴롭히기 때문에 그의 예제는 ==가 대칭이 아님을 보여줍니다. 현재 이진 관계에 대해 commutativity가 지정되는 방법을 보지 못했습니다.
PeterAllenWebb

660

C와 C ++의 3 가지 그래프.

int main() {
   printf("LOL??!");
}

LOL|trigraph가로 ??!변환되어 인쇄 됩니다 |.


71
빨리! 모든 C / b / 프로그래머에게 알리십시오!
Esteban Küber

235
아무도 당신이 무엇을 발견하지 못할 것임을 확신 할 수 있기 때문에, 삼단 법은 훌륭하다! 이미 이름을 모르고 Google에서 의미합니다.
zaratustra

56
GCC에서는 기본적으로 3 가지 기능이 비활성화되어 있습니다.
sastanin

360
이를 통해 "WTF 연산자"를 사용할 수 있습니다 : (foo ()! = ERROR) ??! ??! cerr << "오류가 발생했습니다"<< endl;
user168715

57
서론은 소개 될 때 필요한 악이었다. 일부 플랫폼에는 언어에 대한 특정 문자 키가 포함되어 있지 않으므로 "인쇄"또는 "C 컴파일러 기간 종료 말을 사용할 수 없으므로 어셈블러를 사용하십시오". "The C ++ Programming Language"에서 Stroustrup의 설명을 확인하십시오.
유로 Micelli

573

자동 권투와 Java의 정수 캐시로 재미있게 즐기십시오.

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

설명

Java 소스 코드를 살짝 살펴보면 다음과 같은 결과가 나타납니다.

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

참고 : 속성으로 설정하지 않으면 IntegerCache.high기본값은 127입니다.

자동 복싱에서 발생하는 일은 명시 적으로 작성하지 않는 한 foo와 bar 모두 동일한 정수 객체를 캐시에서 검색하는 것입니다. 예를 들어 foo = new Integer(42), 참조 평등을 비교할 때는 false가 아니라 true입니다. 정수 값을 비교하는 올바른 방법은.equals;


31
이유를 알기 위해 몇 초가 걸렸습니다 ... java는 -128에서 128 사이의 값을 위해 Integer 인스턴스 풀을 유지해야합니다. 그렇지 않으면 새로운 Integer를 할당합니까?
Mike Akers

18
그러나 new Integer (42)를 지정하면 풀에서 인스턴스를 사용하지 않으므로 foo == bar는 false로 평가됩니다.
z-

10
가능하면 항상 정수 대신 정수를 사용하지만 어떤 이유로 정수를 사용해야하는 경우 == 대신 .equals ()를 사용해야합니까?
MatrixFrog

246
C # 프로그래머 인 것이 기쁩니다.

87
@Will : C #에는 매우 비슷한 문제점이 있습니다. blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
spookylukey

373

닐 프레이저 인용 (그 페이지의 끝 부분을보십시오)

try {
    return true;
} finally {
    return false;
}

(Java에서는 작동하지만 JavaScript와 Python에서는 동작이 분명히 동일합니다). 결과는 독자에게 연습으로 남습니다.

편집 : 주제에 관한 한 다음 사항도 고려하십시오.

try {
    throw new AssertionError();
} finally {
    return false;
}

42
+1. 어떤 이유로 든, 나는이 재미있는 것을 발견하고 낄낄 거림을 멈출 수 없습니다.
outis

153
고맙게도 C #은 그런 광기를 허용하지 않습니다 ...Control cannot leave the body of a finally clause
Richard Ev

64
이것은 거짓을 반환합니까? 그것은 WTF처럼 보일 수도 있지만 아마도 하나 일 것입니다. 그러나 나는 규칙에 따라 살고 있습니다.
Michael Stum

28
: 공정을하기 위해, 나는 당신이 전원 코드를 꺼낼하지 않는 한 결국 항상 승리하는 것이 기억에 대한 TDWTF의 좋은 설명을 비난 thedailywtf.com/Articles/My-Tales.aspx
마이클 방부제로 발효를 막다

22
이 경우 코드가 무엇을 반환해야하는지 잘 모르겠습니다. 그러나 나는 당신 returnfinally절 에 들어가서 는 안된다고 확신합니다 .
jfs

325

APL (모두 제외), 한 줄로 프로그램을 작성할 수있는 기능.

예를 들어 APL에서 한 줄로 Conway의 인생 게임 :

대체 텍스트 http://catpad.net/michael/APLLife.gif

그 라인이 WTF가 아니라면 아무것도 아닙니다!

그리고 여기 비디오가 있습니다


19
나는 APL을 좋아한다. 아, 반 줄의 코드를 작성하기 위해 오후 내내 보내는 기쁨! 표시되는 문자를 프로그래밍 할 수있는 키보드를 얻을 때 가장 먼저해야 할 일은 APL에 다시 연락하는 것입니다.
Daniel C. Sobral

24
그리스인의 언어처럼 보입니다.
Esko

45
@Erik : 원하는 코드에만 도달하는 방법이 아니라 코드 작성에 기쁨이 있습니다. 코드를 단일 표현식으로 표현합니다. 궁극의 완벽한 카타나 컷과 같습니다. 물론, 실제 싸움에서 나는 총을 가지고 싶습니다.
Daniel C. Sobral

7
@Daniel : 한 줄의 코드를 작성하기 위해 오후 내내, 그리고 한 줄의 코드 를 읽으려면 일주일 내내 보냅니다 . ;-)
Jürgen A. Erhard

93
공상 과학 액션 영화에서 APL을 보는 것이 좋을 것입니다. 누군가가 3 색 터미널을 중얼 거리며 앉아있는 것을 상상할 수 있습니다. 폭발과 환호가 이어졌습니다.
Joey Adams

321

C ++ 템플릿을 사용할 수있는 이상한 것은 템플릿을 사용하여 "그린"모양의 영역을 계산하는 "다차원 아날로그 리터럴" 에서 가장 잘 설명됩니다 . 다음 코드는 3x3 사각형에 유효한 C ++입니다.

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

또는 3D 큐브를 사용한 또 다른 예는 다음과 같습니다.

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

18
Eelis의 아날로그 리터럴은 훌륭하지만 이상한 언어 기능입니까 , 아니면 기능사용 하는 이상한 방법 입니까?

85
실제 WTF는 잘못된 형식 중 하나에 의해 생성 된 컴파일러 오류입니다.
Andrew McGregor

6
이클립스에서 X, Y 및 Z 축 주위에 리터럴을 돌리는 것을 지원하는 AnalogLiterals 버전이있을 때 다시 깨어납니다. 이제 "시각적 프로그래밍"에 새로운 진정한 의미를 부여합니다.
TheBlastOne

2
o와 l, 그리고 |의 순서가 중요합니까?
Ming-Tang

4
템플릿은 연산자 오버로딩을 창의적으로 사용하기 때문에 순서가 중요합니다. (실제 코드로이 작업을 수행하지 않으면 연산자를 잘못 사용하면 코드를 읽기가 어렵습니다)
josefx

292

펄의 많은 내장 변수 :

  • $#— 코멘트가 아닙니다 !
  • $0,, $$$?— 같은 이름의 쉘 변수와 동일
  • , $&$'— 이상한 일치 변수
  • $"$,— 목록 및 출력 필드 구분자를위한 이상한 변수
  • $!errno숫자와 같지만 strerror(errno)문자열
  • $_- 스텔스 변수는 항상 사용 및 본 적이
  • $#_ — 마지막 서브 루틴 인수의 색인 번호 ... 아마도
  • @_ — 현재 함수의 (비) 이름 ... 아마도
  • $@ — 마지막으로 발생한 예외
  • %:: — 기호 표
  • $:, $^, $~, $-,와 $=- 뭔가 출력 형식으로해야 할 일
  • $.$%— 입력 라인 번호, 출력 페이지 번호
  • $/$\— 입력 및 출력 레코드 구분 기호
  • $| — 출력 버퍼링 컨트롤러
  • $[— 어레이 기반을 0 기반에서 1 기반에서 42 기반으로 변경 : WHEEE!
  • $}전혀 이상하지 않습니다!
  • $<, $>, $(, $)- 진짜하고 효과적인 UID 및 GID
  • @ISA — 현재 패키지의 직접 수퍼 클래스 이름
  • $^T — 에포크 초 단위의 스크립트 시작 시간
  • $^O — 현재 운영 체제 이름
  • $^V —이 버전의 Perl 버전

더 많은 곳이 있습니다. 여기 에서 전체 목록을 읽으 십시오 .


83
$[변수는 그들 모두의 가장 악한.
브래드 길버트

24
Perl 6이 perldoc perlvar5 초마다 확인하지 않고 코딩 할 수있는 것이라면 분명히 감사하겠습니다 . (반드시 반으로 "내가 이것을 수행 할 수있는 특별한 변수가 있다는 것을 알고 있지만 어느 것을 기억하지 못하는지 모르겠다 ..."= P)
Chris Lutz

17
문제 use English;는 RegExp 성능에 영향을 미친다는 것입니다. 나는 이것을 만들고 있지 않다. perldoc.perl.org/English.html#PERFORMANCE
Dave Webb

13
@Dave : 링크 한 페이지의 -no_match_vars 옵션으로 인해 문제가되지 않습니다. @ 브래드 : $ [는 너무나 사악합니다. 그 배후의 의도는 사악하지만 물론 작동하지 않습니다! @Artem : from perlvar "숫자, 제어 문자 또는 문장 부호로 시작하는 Perl 식별자는 패키지 선언의 영향을받지 않으며 항상 패키지 main에 있어야합니다. 또한 엄격한 'vars'오류도 면제됩니다." 따라서 엄격한 조건에서도 @ $가 만들어지고 오류없이 할당됩니다. 어!
rjh

4
@Brian : 공식 문서 자체에 Perl 인터프리터 가 일련의 문자가 무엇을 의미하는지 추측 적으로 추측 할 수있는 상황이 있다고 말하면 구문을 배우도록 어떻게 제안 합니까? 예를 들어 /$foo[bar]/, 그 [bar]부분은 배열에 대한 문자 클래스 또는 첨자 @foo입니까? 끔찍한 대답을 위해 perldata를 잡으십시오.
j_random_hacker

289

문자열에서 PHP의 숫자 값 처리 . 자세한 내용 은 다른 질문에 대한 이전 답변을 참조하십시오 .

"01a4" != "001a4"

다른 수의 문자를 포함하는 두 개의 문자열이 있으면 동일하게 간주 할 수 없습니다. 선행 0은 숫자가 아닌 문자열이므로 중요합니다.

"01e4" == "001e4"

PHP는 문자열을 좋아하지 않습니다. 값을 숫자로 취급 할 수있는 변명을 찾고 있습니다. 해당 문자열의 16 진 문자를 조금씩 갑자기 변경 PHP는 더 이상 문자열이 아니라고 과학 표기법의 숫자 (PHP는 따옴표를 사용하지 않음)이며 숫자에 대해서는 선행 0이 무시되므로 동등합니다. 이 점을 강화하기 위해 PHP는 "01e4" == "10000"동등한 값을 가진 숫자이기 때문에 PHP도 참으로 평가 됩니다. 이것은 행동으로 기록되어 있으며, 그다지 현명하지는 않습니다.


56
===와! ==를 사용하십시오. 느슨한 유형 비교가 필요하지 않으면 어쨌든 사용해야합니다.
Dykam

14
@Dykam, 더 자세한 답변에 대한 링크를 따르면 === 연산자의 사용을 다루었 음을 알 수 있습니다.
Dan Dyer

18
타이핑이 약 해졌다!
gillonba

43
나는 항상 PHP가 죄라는 것을 알고있었습니다. D : 지금까지 내가 몰랐까지 그것은 용서받을 수없는 죄였다
토마스 대한 수정 사항

2
프로그래밍 책이나 튜토리얼에서 사람들이 ===를 사용하도록 기술해야합니다. 추가 사항 : 잘못 작성된 PHP 앱에서 같은 숫자로 구문 분석 된 것을 암호로 제공 할 수있었습니다.
Pepijn

282

예약어를 없애려고 시도한 모든 언어 (예 : PL / I)에 대한 투표를하겠습니다.

합법적으로 다음과 같은 재미있는 표현을 쓸 수있는 곳은 어디입니까?

IF IF THEN THEN = ELSE ELSE ELSE = THEN

( IF, THEN, ELSE변수 이름이다)

또는

IF IF THEN THEN ELSE ELSE

( IF변수이고, THENELSE서브 루틴)


1
@ 쿼크 : 이것에 대한 별도의 답변입니다! ;) ... (그렇습니다. 영어로 프로그래밍 할 수 있습니다. 다른 개발자에게 .ppt로 배포하면됩니다.;)
Macke

28
@RoadieRich 버팔로의 한 그룹은 명시 적으로 버팔로 출신이 아니며 단지 설명이 아닌 버팔로입니다.
Jürgen A. Erhard

18
야고보가 가지고 있었던 요한은 교사에게 더 나은 영향을 미쳤습니다.
GameFreak

4
나는 다른 날 벤과 제리 아이스크림 공장 외부의 사인 제조사들을 보았습니다. 나는 그들의 작품을 비판했고, 벤과 앤 그리고 제리 사이에 충분한 공간이 없다고 말했다.
Tom Gullen

9
미래의 시간 프로그램에 필요할 수도 있습니다. 그렇다면 = 지금 & 어디에서 = 여기에있을 때 = 그때에 다른 사람 = 다른 곳에
Kelly S. French

282

JavaScript 8 진 변환 '기능'은 다음 사항을 잘 알고 있습니다.

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10

자세한 내용은 여기를 참조 하십시오 .


60
8과 9를 제외한 모든 숫자가 작동하는 버그를 고수했습니다! 미쳐 가고 있었다! !! 고마워 브라이언!
Faruz

10
@Yada 8 진수를 의미하지 않습니까? 16 진수는 0x입니다.
luiscubal

48
그래서 parseInt는 (선택적) 추가 인수를 취합니다. :).
LiraNuna

10
선행 0은 8 진수를 의미합니다. 8은 유효한 8 진수가 아니므로 결과는 0이어야합니다.
devio

22
... 그리고 parseInt ( '010')-> 8 당신을 혼란스럽게합니다.
Richard Gadsden

213

C의 더프 장치!

C에서는 switch 문으로 do / while을 인터레이스 할 수 있습니다. 이 방법을 사용하는 memcpy의 예는 다음과 같습니다.

void duff_memcpy( char* to, char* from, size_t count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
    case 0: do{ *to++ = *from++;
    case 7:     *to++ = *from++;
    case 6:     *to++ = *from++;
    case 5:     *to++ = *from++;
    case 4:     *to++ = *from++;
    case 3:     *to++ = *from++;
    case 2:     *to++ = *from++;
    case 1:     *to++ = *from++;
            }while(--n>0);
    }
}

9
더프의 장치는 아마도 스위치 명령문이 기본적으로 중단되지 않는 좋은 이유 일 것입니다. 오, 잠깐만, 또 다른 용도가 있습니다 : 코 루틴과 프로토스 레드.
Frunsi

16
@frunsi : "더프 장치는 아마도 스위치 명령문이 기본적으로 중단되지 않는 좋은 이유 일 것입니다."-항상 일반적인 경우를 기본값으로 설정하십시오. 나는 이것이 일반적인 경우라고 정확하게 말하지는 않을 것이다.
BlueRaja-Danny Pflughoeft

6
@mcv는 아마도 어셈블리 코드로 읽으려고하면 가장 쉽습니다. 즉, while끝에는 (조건부) JMP다시 (조건부)입니다 do. 이것은 왜 do루프를 건너 뛸 수 있는지 설명합니다 .
wds

14
Duff 's Device는 일반적으로 최신 컴파일러의 일반적인 루핑 명령문보다 WORSE 코드를 생성한다는 점을 명심하십시오.이 컴파일러는 수동으로 할 수있는 것보다 루프 언 롤링 방법을 알고 있습니다.
Billy ONeal

37
@frunsi : 더프 자신이 그것을 출판하고 다음과 같이 주장했다 : "이것은 스위치가 기본적으로 넘어 져야하는지 논의에서 논쟁을 제공하지만, 논쟁이 그 반대인지 아닌지 확실하지 않다"
SF.

204

이름으로 알골 패스 (C 구문을 사용하여 그림) :

int a[3] = { 1, 2, 3 };
int i = 1;

void f(int j)
{
    int k;
    k = j;  // k = 2
    i = 0;
    k = j;  // k = 1 (!?!)    
}

int main()
{
    f(a[i]);
}

33
당신이 그것에 대해 생각하면, 그것은 실제로 어떤 종류의 꼬인 의미가 있습니다
RCIX

90
이것이 궁극적 인 "통과 기준"입니다.
Dykam

3
Scala에서 가능하지만 ( def f(j : => int))
Dario

10
그래서 이것은 같은 것 ... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }입니까?
Simon Buchan

2
실제로는 매우 간단합니다. 식에서 발생하는 주소를 계산하는 작은 코드 조각 (일반적으로 "thunk", 따라서 위의 말장난이라고 함)을 생성합니다 (이 경우 & a [i]). 이 함수에 대한 포인터는 호출 된 함수에 전달되며,이 함수를 사용하여 매개 변수에 액세스 할 때마다 현재 주소를 계산합니다.
Richard Pennington

189

파이썬에서 :

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

WTF는 아니지만 유용한 기능입니다.


176
나는 다른 모든 언어가이 기능을 가지고 소원
vava

32
거의 모든 멋진 Python 기능과 마찬가지로 Guido는 멋진 Lisp 기능의 구문을 ALGOL로 정의한 것처럼 보입니다. :-)
Ken

4
Geoffrey, 기능 및 (10 > 5 > 1) != ((10 > 5) > 1)Python.
sastanin

18
또한 한 번만 평가되므로 한 번만 (funct_a(5)+5 > b > funct_a(5))호출 funct_a(5)합니다. 훌륭한 기능입니다!
Khelben

57
@Khelben : 아니요 funct_a.이 예에서는 두 번 호출됩니다. 에서는 b > funct_a(5) > c반대로 그것은 단지 한 번 생각 호출됩니다 b > funct_a(5) and funct_a(5) > c.
Baffe Boyois

189

자바에서 :

int[] numbers() {
  return null;
}

다음과 같이 쓸 수 있습니다 :

int numbers() [] {
  return null;
}

23
와! 배열 구문이 설계되었을 때 벽에 날아갈 수 있기를 바랍니다!
Adam Paynter

29
나는 이것을 말하기 싫어하지만 WTF는 C 유형 시스템의 일관된 확장입니다. C 함수가 배열을 반환하도록 허용 된 경우 다음과 같습니다. 더 좋은 것은 더 읽기 쉬운 일관성 위반입니다. "const char * var"대 "char const * var"와 매우 유사합니다.
Gordon Wrigley

15
@Adam-변수 선언이 "int stuff []"및 "int [] stuff"를 모두 유사하게 허용한다는 것을 고려할 때 실제로 의미가 있습니다. 메소드 선언에 동일한 규칙이 적용되도록합니다.
Brandon Yarbrough

2
@lImbus : 사실, const T*그리고 T const*동일 T* const합니다. 포인터를 구성하는 것입니다. 또한, 나는 산세 글꼴이 싫어.
Simon Buchan

3
결국, numbers()[2]법적인 진술입니다.
badp

184

INTERCAL 은 아마도 가장 이상한 언어 기능에 대한 최고의 개요 일 것입니다. 개인적으로 가장 좋아하는 것은 COMEFROM 문장으로 GOTO와 거의 반대입니다.

COMEFROM은 코드의 임의의 지점에서 COMEFROM 문으로 실행 상태를 취할 수 있다는 점에서 GOTO와 반대입니다. 상태 전송이 발생하는 코드 포인트는 일반적으로 COMEFROM에 매개 변수로 제공됩니다. 전송이 지정된 전송 지점에서 명령 전후에 발생하는지 여부는 사용 된 언어에 따라 다릅니다. 사용 된 언어에 따라 동일한 출발점을 참조하는 여러 COMEFROM이 유효하지 않거나 비 결정적이거나 정의 된 우선 순위로 실행되거나 스레드 인터 칼에서 볼 수 있듯이 병렬 또는 동시 실행을 유발할 수 있습니다. "COMEFROM x"문의 간단한 예는 "트랩 도어"역할을하는 레이블 x (해당 COMEFROM 근처에 실제로 위치 할 필요는 없음)입니다. 코드 실행이 레이블에 도달하면 COMEFROM 다음에 오는 명령문으로 제어가 전달됩니다. 이것의 효과는 주로 디버깅 (및 프로그램의 제어 흐름 이해)을 매우 어렵게 만드는 것입니다. 레이블 근처에서 제어가 신비하게 프로그램의 다른 지점으로 이동한다는 표시가 없기 때문입니다.


16
아주 악하다-라벨을 GOTO로 바꾼다. 해커가 구걸 할 언어 기능처럼 들리 겠지만
RCIX

114
INTERCAL은 재미있을 것입니다. 이것은 놀라운 "gotcha"가 아닙니다. INTERCAL 컴파일러는 PLEASE수정자를 자주 사용하지 않으면 실제로 프로그램 컴파일을 거부 할 수 있습니다 !
Groo

10
AOP와 같은 소리 :)
akuhn

6
"World of Commercial TI"의 시스템 요구 사항 분석에서 COMEFROM은 실제로 사용 사례를 설명하는 텍스트 파일에 사용됩니다. (진실하게 : 일부 분석가들은 여기에서 링크의 필수 세분성을 가진 "comefrom"을 올바르게 참조 할 수 없기 때문에 MS의 Office 대신 OpenOffice 로의 전사적 인 마이그레이션을 지연시켰다)
jsbueno

5
Groo : 더 나쁘다. PLEASE를 너무 자주 사용하면 그 로브하고 있기 때문에 프로그램 컴파일을 거부합니다 (C-INTERCAL은 PLEASE 수정자를 사용하려면 명령문의 33 %-66 %가 필요함).
Vatine

160

실제로 언어 기능은 아니지만 구현상의 결점 : 일부 초기 포트란 컴파일러는 상수 풀을 사용하여 상수를 구현했습니다. 모든 매개 변수는 참조로 전달되었습니다. 예를 들어 함수를 호출 한 경우

f(1)

컴파일러는 상수 풀에있는 상수 1의 주소를 함수에 전달합니다. 함수에서 매개 변수에 값을 지정하면 프로그램에서 전체적으로 값 (이 경우 값 1)을 변경합니다. 머리가 긁혔습니다.


124
아 그리고 2+2 와 동일 5(매우 큰 값을 2물론!).
Alok Singhal

12
음, 2의 어떤 값이 "2 + 2"== "5"가됩니까? 정수 값 2가 사실인지 알 수는 없습니다.
Aaron

36
@earlz : 비트 패턴의 정수 값으로 감길 것이라고 생각합니다. 다른 한편으로, 당신은 아마 그런 식으로 5에서 4를 설정할 수 있습니다 (따라서 작은 값의 2+2경우 동일 ). 55
David Thornley

18
실례합니다. Alok, 우리가 이야기하고있는 초기 포트란입니다. 사실이 아닙니다 2 + 2 = 5; 그것은 구문 오류 일 것입니다. 사실은 2 + 2 .EQ. 5입니다.
David Thornley

3
Haskell에서 다음 스 니펫은 5로 평가됩니다. "2 + 2에서 2 + 2 = 5로하자":)
Tirpen

153

언어 기능으로 간주 될 수 있는지는 모르지만 C ++에서는 템플릿과 관련된 거의 모든 컴파일러 오류가 전세계의 많은 C ++ 프로그래머에게 매일 상당한 양의 WTF를 제공합니다. :)


15
괜찮습니다. 템플릿과 관련된 대부분의 코드는 이미 전 세계에 많은 WTF를 생성합니다.
Joris Timmermans

43
오 어서 `std :: basic_ostream <char, std :: char_traits <char>> & std :: operator << <std :: char_traits <char>> (std :: basic_ostream <char, std :: char_traits <char>에 대한 정의되지 않은 참조 > &, char const *) '완벽하게 읽을 수 있습니다!
Matt Greer

10
한 번은 템플릿 관련 컴파일러 오류가 5 줄로 가장 짧았으며 그 중 가장 짧은 것은 17,000 문자였습니다 (깊게 템플릿 된 프로그램의 고전적인 x와 일치하지 않는 오류). 그것은 처음부터 기능이 아니라 WTF입니다. 템플릿은 훌륭합니다.
Andrew McGregor

111
오류가 없더라도 프로파일 러에서 가장 오래 걸리는 기능을 찾으십시오. 오, 봐요std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
rlbond

12
이것이 여기에 맞는 것 같습니다. bdsoft.com/tools/stlfilt.html에서 STLFilt 를 확인하여 출력을 읽을 수있게 만드십시오.
foraidt

150

C의 많은 네임 스페이스 :

typedef int i;

void foo()
{
    struct i {i i;} i;
    i: i.i = 3;
    printf( "%i\n", i.i);
}

또는 문자로 :

typedef char c;

void foo()
{
    struct c {c c;} c;
    c: c.c = 'c';
    printf( "%c\n", c.c);
}

도대체 어떻게 모호하게 컴파일합니까!?
Earlz

13
열거 형과 구조체의 +1 태그 식별자는 C imho에서 가장 혼란스러운 부분입니다. 구조에 대한 포인터를 typedef하는 관용구가 왜 그렇게 보이는지 이해하는 사람은 거의 없습니다.
Tadeusz A. Kadłubowski 2019 년

11
그것은 내가 가진 모든 사람들이 컨텍스트로 인해 명확한 네임 스페이스를 가지고 있기 때문에 컴파일됩니다.
Andrew McGregor

149

파이썬의 전체 공백은 나의 가장 큰 WTF 기능이라고 말할 것입니다. 사실, 당신은 다소 후에 익숙해 져서 현대 편집자들은 다루기가 쉬워 지지만 지난 몇 년 동안 대부분의 풀 타임 파이썬 개발 후에도 여전히 그것이 나쁜 생각이라고 확신합니다. 나는 그 뒤에 모든 추론을 읽었지만 솔직히 내 생산성에 방해가됩니다. 많지는 않지만 여전히 안장 아래에 버입니다.

편집하다: 의견으로 판단하면 일부 사람들은 내 코드를 들여 쓰기를 원하지 않는다고 생각합니다. 그것은 잘못된 평가입니다. 언어와 강요 여부에 관계없이 항상 코드를 들여 쓰기했습니다. 내가 싫어하는 것은 한 줄의 코드가 들어있는 블록을 정의하는 들여 쓰기라는 것입니다. 나는 명시 적 구분 기호를 선호합니다. 다른 이유 중에서도 명시 적 구분 기호를 사용하면 코드를 쉽게 잘라 붙여 넣을 수 있습니다.

예를 들어, 4 칸 들여 쓰기 된 블록이 있고 8 칸 들여 쓰기 된 블록의 끝에 붙여 넣으면 붙여 넣은 코드가 8 칸 블록 또는 외부 칸에 속하는지 내 편집자 (모든 편집자?)는 알 수 없습니다. 블록. OTOH, 명시 적 구분 기호가 있으면 코드가 속한 블록과 코드를 어떻게 들여 쓰기 해야하는지 분명합니다. 블록 구분 기호를 지능적으로 찾아서 그렇게합니다.

편집 2 : 의견을 제공하는 일부 사람들은 이것이 내가 싫어하는 기능이라고 생각하거나 파이썬을 열악한 언어로 생각합니다. 다시 한 번 사실이 아닙니다. 나는 그것을 많이 좋아하지 않지만 요점 옆에 있습니다. 문제는 가장 이상한 언어 기능 에 관한 것입니다. 언어가 매우 적지 만 (0보다 큰) 언어를 사용하기 때문에 이것이 이상하다고 생각합니다.


63
그것이 생산성을 방해한다면 비 파이썬 코드는 읽을 수 없습니다 ...
Tor Valamo

27
파이썬 전에 어떤 언어를 사용하셨습니까? 다른 사람들과 어떻게 일하면서 그 언어를 들여 쓰지 않았습니까? 누구나 어떤 언어 로 들여 쓰기되지 않은 코드를 넣을 수 있습니까? 소스 코드에 시각적 신호가 필요없는 천재로 가득 찬 방에서 일했습니까?
S.Lott

53
+1 편집자 (Emacs)가 자동으로 구별되는 무언가 (중괄호 / 시작, 끝 / 이름 지정 등)를 기반으로 내 코드를 들여 쓰기 할 수 없으면 더 이상 어리석지 않습니다. "더 큰"기능에 대해 수행하는 리팩토링은 대부분 나쁜 경험이 될 수 있습니다.
Dmitry

83
다른 언어와 함께 코드 블록을 강조 표시하고 모든 편집기에서 올바르게 들여 쓰기 할 수 있습니다. 그러나 공백은 정의에 의해 들여 쓰기가 적절하기 때문에 파이썬에서 그 능력을 잃습니다. 따라서 코드를 이동하거나 리팩터링하기가 더 어렵습니다. 그리고 OP를 주장하는 사람은 "문제라고 주장하는 첫 번째 사람"이라고 생각합니다. 잠깐 동안 파이썬 코드를 유지해야 했고이 이유로 파이썬보다 모든 언어를 사용할 것입니다.
Kendall Helmstetter Gelner

38
파이썬의 공백은 신경 쓰지 않습니다. WTF는 지속적으로 시행되지 않는다는 것입니다. 들여 쓰기 수준과 탭이 형제와 일치하는 한 들여 쓰기 수준과 탭을 혼합 할 수 있습니다. 따라서 첫 번째 들여 쓰기 수준은 하나의 공백이되고 두 번째 들여 쓰기는 두 개의 TAB이 될 수 있으며 이는 구문 오류가 아닙니다.
ieure

138

나는 이것에 대해 조금 고투했다.

1;

perl에서 모듈은 true 를 반환해야 합니다 .


29
일부 모듈은 런타임 작업에 따라 값을 반환 할 수 있습니다. 항상 true를 반환하더라도 여전히 창의성을 발휘할 필요는 없습니다. returnvalues.useperl.at
Anonymous

8
내 Perl 메모리가 올바르게 작동하면 모듈에서 true를 반환하면 모듈이 성공적으로로드 된 것입니다. 잘못된 값을 반환하면 문제가 발생하여 프로그램이 실행되지 않습니다 (잡히지 않은 경우).
베리 브라운

이것은 유효한 C 문이기도하며 아무 것도 반환되지 않습니다.
sigjuice

24
Mark Dominus는 " 'Cogito ergo sum';모든 사람이 알고있는 모든 우주에서 자명 한 사실을 거의 사용하지 않았습니다 . 이는 최대한의 이식성을 보장합니다."라고 말했습니다.
Greg Bacon

PHP <?=1;?>는 1을 <?=true;?>반환합니다. 1을 <?=false;?>반환합니다.
Talvi Watia

135

아무도 Visual Basic의 7 루프 구조를 언급하지 않은 것에 놀랐습니다 .

For i As Integer = 1 to 10 ... Next
While True ... End While
Do While True ... Loop
Do Until True ... Loop
Do ... Loop While True
Do ... Loop Until True
While True ... Wend

붙어 있기 때문에! 조건부 앞에있는 방법 이 너무 복잡!


47
그들은 목소리가없는 음순으로 깎은 벨로 미어로 "while"이라는 단어를 발음하는 사람들이 있기 때문에 " WhileWhend" 로 만들었어야했다 . 그리고 물론 줄이 더 좋고 줄이있는 코드도 좋습니다.
dreamlax

43
왜 그렇게 행동하는거야?
Erik Forbes

48
와. 내가 생각할 때 약간의 향수를 얻습니다. 제가 VB를 처음 사용한 것은 9 살이었습니다. 나는 스웨덴 출신이고, 당시 영어에 능숙하지 않았습니다. 이제 "vänd"라는 스웨덴어가 있는데, 기본적으로 "돌아 가기"를 의미하며 "wend"와 유사하게 발음됩니다. 그것 때문에 나는 그것이 많은 의미가 있다고 생각했습니다 ... :)
Emil H

61
! VB가 아닌 "Not"입니다. 아니면? 예, 아닙니다! 그러나 아닙니다.
brianary

7
예, "Wend"는 영어 단어로 어떤 과정이나 길을 따라 가거나 진행해야 함을 의미합니다 ( google.com/search?q=define%3A+wend ). 그것이 도움이되는지 아프지 않은지 확실하지 않습니다.
Michael Myers

134

모르는 사람들을 위해 bc"임의 정밀도 계산기 언어"가 있으며, 특히 관련 숫자가 클 때 빠른 계산을 위해 자주 사용합니다 ( $프롬프트).

$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032

bc되었습니다 표준 유닉스 명령어 오랜 시간 동안.

이제 "WTF 기능"입니다. 이것은 man bc(강조 광산) 에서 온 것입니다.

quit : quit 문을 읽을 때 quit 문을 찾은 위치에 관계없이 bc 프로세서가 종료됩니다. 예를 들어, "if (0 == 1) quit"은 bc를 종료시킵니다.

halt : halt 문 (확장자)은 bc 프로세서가 실행될 때만 종료되도록하는 실행 문입니다. 예를 들어, "if (0 == 1) 중지"는 중지가 실행되지 않기 때문에 bc를 종료하지 않습니다.


41
나는이 물건에 Haskell을 사용합니다.
Thomas Eding

8
구글 계산기?
igul222

7
파이썬을 직접 사용하기 시작했으며 온라인에 있으면 Google 계산기가 좋습니다. 그러나 나는 bc그 전에 사용 bc했고 매뉴얼 페이지의 큰 따옴표 때문에 내 게시물에 글 을 쓰고 싶었습니다 .
Alok Singhal

6
@Brian, 당신은 좋아할 것입니다 : echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc(이미 이미 알고있을지라도).
Alok Singhal

2
irb (Ruby interactive shell)를 사용합니다. 그러나 그날 다시, 나는 항상 BC와 같은 dc에 도달했지만 역 광택을 사용합니다. 괴짜!
tragomaskhalos

134

나는 왜 가장 간단한 프로그램인지 궁금했습니다.

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

반면에 :

print "Hello World!"

어쩌면 이것은 컴퓨터 과학 학생들을 처음에 두려워하는 것입니다 ...


34
일부 언어에서는 "Hello World!" 유효한 프로그램입니다.
David Thornley

31
@SoMoS : Python, Ruby 또는 Perl과 같은 대부분의 동적 언어에서 "Hello World!" 또는 약간의 변형 (예 : 인쇄 대신 풋)은 유효하고 완전한 프로그램입니다.
Dave Kirby

36
@Loadmaster : "모든 코드는 클래스에 속합니다"또는 "모든 코드는 함수에 속합니다"라는 불필요한 제약이 있습니다
Jimmy

19
언어가 객체 사용을 강요한다고해서 해당 객체 지향 프로그래밍에 사용되는 것은 아닙니다. Java 또는 C #으로 절차 적으로 프로그래밍 할 수 있습니다. 이것이 정적 방법입니다.
jdmichal

68
나는 OOP가 모든 것이 대상이어야 함을 의미한다고 생각하는 사람들을 사랑합니다.
Tor Valamo

132

JavaScript는 객체 지향입니다. 따라서 리터럴 문자열과 숫자에서 메소드를 실행하면 작동합니다. 좋아 "hello".toUpperCase()하고 3.toString(). 두 번째 것은 구문 오류라는 것이 밝혀졌습니다. 왜 그렇습니까? 파서는 숫자 다음에 점이 부동 소수점 리터럴이되기를 기대하기 때문입니다. 그것은 WTF가 아니며 WTF는 다른 점을 추가해야 작동한다는 것입니다.

3..toString()

그 이유는 리터럴이다 3.로 해석 3.0하고, 3.0.toString()잘 작동합니다.


8
파이썬에서도 이런 식으로 작동합니다 (시도 3..__add__(4)). 그런 다음 다시 (3).__add__(4)뇌 손상이 훨씬 덜 생각 합니다 :)
badp

49
당신은 (3) .toString ()을 할 수 있습니다
Joseph Montanez

13
@ Gorilla3D : 예,하지만 이상한 언어 기능은 아닙니다. 그렇지 않습니까?
Theo

25
3.0.toString()내 눈이 가려워집니다.
Ben Blank

18
127.0.0.1.toInt ()
berkus

130

자바 스크립트에서 :

2 == [2]

// Even stranger
2 == [[[2]]]

// And down-right nutty
var a = { "abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true

운 좋게도 stackoverflow.com의 친절한 사람들은 나에게 모든 것을 설명했습니다. 왜 JavaScript에서 2 == [2]입니까?


6
그렇기 때문에 ===대신 사용해야 합니다.
Gumbo

10
이것은 btw에 유용합니다. 숫자를 반환하는 함수가 있고 추가 메타 데이터를 반환하려는 경우 추가 필드가 추가 된 [number]를 반환 할 수 있습니다. 간단한 코드는 실수가 아니라는 것을 절대 알 수 없으며 다른 코드는 필요한 메타 데이터를 얻을 수 있습니다.
Andrey Shchekin

36
@Andrey는 내가 제안한 것을 수행하는 코드를 유지 해야하는 경우를 제외하고는 곧 저자의 죽음을 원할 것입니다.
Breton

@Andrey, 그거 좋은 생각이야! 당신은 또한 사용할 수 있습니다Number(n)비슷한 것을 위해 . 불행히도 두 솔루션 모두에서 ==== (.
Xavi

5
+1 : 나는 스스로 지식이 풍부한 js 프로그래머라고 생각했는데, 이것에 대해 결코 알지 못했습니다 : D
Thomas Eding

126

가장 싫어하는 가장 큰 특징은 조건부 논리를 포함하는 구성 파일 구문입니다. 이런 종류의 일은 Java 세계에서 잘 알려져 있습니다 (Ant, Maven 등. 당신은 당신이 누구인지 알고 있습니다!).

제한적인 디버깅 및 제한된 편집기 지원을 통해 ac ** p 언어로 프로그래밍이 완료됩니다.

구성에 논리가 필요한 경우 실제 언어로 구성을 코딩하는 "Pythonic"접근 방식이 훨씬 더 좋습니다.


24
Tcl은 파이썬이 태어나 기 오래 전에 다시 발명했고 Lisp는 그 전에 그것을 발명했습니다. 파이썬으로 부르지 말고, 이멕스로 부르 자.
slebetman

46
그냥 바로라고합시다.
mletterle

30
아멘. 구성 또는 빌드 언어가 작동하지 않으면 잘못하고있는 것입니다. CMake / autotools를보고 있습니다.
Joseph Garvin

16
이것이 원래 Lua를 위해 설계된 것입니다
Cogwheel

1
코드가 Python 인 경우 구성 파일을 Python 파일로 만드는 것이 좋습니다. 파일을 가져 와서 모듈의 속성을 읽기만하면됩니다. 그리고 설정 파일에서 100 % Turing Complete Python의 강력한 성능을 얻을 수 있습니다.
asmeurer

113

powerbasic (www.powerbasic.com)에는 컴파일러 지시문이 포함되어 있습니다.

# BLOAT {bloatsize}

컴파일 된 실행 파일의 크기가 <bloatsize>바이트 단위로 증가합니다 . 이것은 실행 파일을 만드는 사람들이 생성 된 실행 파일의 작은 크기를 좋아하지 않는 경우에 컴파일러에 포함되었습니다. 그것은 부풀어 오른 프로그래밍 언어와 경쟁하기 위해 EXE가 더 크게 보이게합니다 :)


9
하하 육. 개발자들이 의도적으로 무언가를하고 있다고 믿는 데 도움이되기 때문에 일부 작업 (예 : 검색)을 의도적으로 느리게하는 것에 대해 들었습니다. 비슷한 것 같아요.
David

42
최근에 읽은 내용을 생각 나게합니다. 그들은 FPS를 테스트하고 나쁜 사람들이 가진 명중 점수를 늘리기로 결정했습니다. 그런 다음 테스터들에게 AI가 어땠는지 물었고, 더 똑똑하다고 맹세했습니다. 그러나 AI는 변경되지 않았으며 히트 포인트 만 변경되었습니다. 사람들은 자신의 머리 속에 세상에 대한 이야기를 가지고 있으며, 당신이 그들의 기대를 이해하고 일치 시키면 이야기를 입증한다고 가정 할 것입니다.
Nate CK

5
나는 프로그램을 복잡하게 만드는 것처럼 보이게하기 위해 프로그램에 많은 추가 속도 저하를 추가했습니다. 다시 초등학교로 돌아 왔습니다.
Matti Virkkunen

3
학교에 우리는 80286 대의 기계를 가지고 있었고, 실제로 적당한 속도 (즉, 크롤링이 아님)를 얻기 위해 어셈블리에서 스크린 출력 루틴을 작성해야했습니다.
berkus

7
인공 지능은 AI를 자랑하는만큼 오래 사는 경우 @Nate CK는, 그것은 실제로 이 너무 빨리 죽을 수 있습니다 전에 그것을 증명하는 반면, 똑똑.
zzzzBov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.