당신의 의견으로는, 당신이 경험 한 가장 놀랍고, 이상하고, 이상하거나 정말로 "WTF"언어 기능은 무엇입니까?
답변 당 하나의 기능 만 사용하십시오.
당신의 의견으로는, 당신이 경험 한 가장 놀랍고, 이상하고, 이상하거나 정말로 "WTF"언어 기능은 무엇입니까?
답변 당 하나의 기능 만 사용하십시오.
답변:
C에서는 배열을 다음과 같이 색인화 할 수 있습니다.
a[10]
이것은 매우 일반적입니다.
그러나 덜 알려진 형태 (실제로 작동합니다!)는 다음과 같습니다.
10[a]
이는 위와 동일 함을 의미합니다.
자바 스크립트에서 :
'5' + 3 gives '53'
이므로
'5' - 3 gives 2
+
문자열 연결이 끔찍합니다
JavaScript에서 다음 구성
return
{
id : 1234,
title : 'Tony the Pony'
};
returns 는 개행 후의 부적절한 암시 적 세미콜론 삽입으로 인한 구문 오류 undefined
return
입니다. 그래도 다음과 같이 작동합니다.
return {
id : 1234,
title : 'Tony the Pony'
};
더 나쁜 것은, 이것도 잘 작동합니다 (적어도 Chrome에서는).
return /*
*/{
id : 1234,
title : 'Tony the Pony'
};
구문 오류가 발생하지 않고 자동으로 실패하는 동일한 문제의 변형이 있습니다.
return
2 + 2;
자바 스크립트 진리표 :
'' == '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
==
언어 디자이너의 눈에는 어떤 목적이 있습니까?
==
의 의미가 있다면 좋을 것 입니다 ===
. 그런 다음 ~=
유형 강제 변환이 허용되는 것과 같은 다른 연산자가 있습니다.
C와 C ++의 3 가지 그래프.
int main() {
printf("LOL??!");
}
LOL|
trigraph가로 ??!
변환되어 인쇄 됩니다 |
.
자동 권투와 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;
닐 프레이저 인용 (그 페이지의 끝 부분을보십시오)
try {
return true;
} finally {
return false;
}
(Java에서는 작동하지만 JavaScript와 Python에서는 동작이 분명히 동일합니다). 결과는 독자에게 연습으로 남습니다.
편집 : 주제에 관한 한 다음 사항도 고려하십시오.
try {
throw new AssertionError();
} finally {
return false;
}
Control cannot leave the body of a finally clause
return
이 finally
절 에 들어가서 는 안된다고 확신합니다 .
APL (모두 제외), 한 줄로 프로그램을 작성할 수있는 기능.
예를 들어 APL에서 한 줄로 Conway의 인생 게임 :
대체 텍스트 http://catpad.net/michael/APLLife.gif
그 라인이 WTF가 아니라면 아무것도 아닙니다!
그리고 여기 비디오가 있습니다
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) );
펄의 많은 내장 변수 :
$#
— 코멘트가 아닙니다 !$0
,, $$
및 $?
— 같은 이름의 쉘 변수와 동일$ˋ
, $&
및 $'
— 이상한 일치 변수$"
및 $,
— 목록 및 출력 필드 구분자를위한 이상한 변수$!
— errno
숫자와 같지만 strerror(errno)
문자열$_
- 스텔스 변수는 항상 사용 및 본 적이$#_
— 마지막 서브 루틴 인수의 색인 번호 ... 아마도@_
— 현재 함수의 (비) 이름 ... 아마도$@
— 마지막으로 발생한 예외%::
— 기호 표$:
, $^
, $~
, $-
,와 $=
- 뭔가 출력 형식으로해야 할 일$.
및 $%
— 입력 라인 번호, 출력 페이지 번호$/
및 $\
— 입력 및 출력 레코드 구분 기호$|
— 출력 버퍼링 컨트롤러$[
— 어레이 기반을 0 기반에서 1 기반에서 42 기반으로 변경 : WHEEE!$}
— 전혀 이상하지 않습니다!$<
, $>
, $(
, $)
- 진짜하고 효과적인 UID 및 GID@ISA
— 현재 패키지의 직접 수퍼 클래스 이름$^T
— 에포크 초 단위의 스크립트 시작 시간$^O
— 현재 운영 체제 이름$^V
—이 버전의 Perl 버전$[
변수는 그들 모두의 가장 악한.
perldoc perlvar
5 초마다 확인하지 않고 코딩 할 수있는 것이라면 분명히 감사하겠습니다 . (반드시 반으로 "내가 이것을 수행 할 수있는 특별한 변수가 있다는 것을 알고 있지만 어느 것을 기억하지 못하는지 모르겠다 ..."= P)
use English;
는 RegExp 성능에 영향을 미친다는 것입니다. 나는 이것을 만들고 있지 않다. perldoc.perl.org/English.html#PERFORMANCE
/$foo[bar]/
, 그 [bar]
부분은 배열에 대한 문자 클래스 또는 첨자 @foo
입니까? 끔찍한 대답을 위해 perldata를 잡으십시오.
문자열에서 PHP의 숫자 값 처리 . 자세한 내용 은 다른 질문에 대한 이전 답변을 참조하십시오 .
"01a4" != "001a4"
다른 수의 문자를 포함하는 두 개의 문자열이 있으면 동일하게 간주 할 수 없습니다. 선행 0은 숫자가 아닌 문자열이므로 중요합니다.
"01e4" == "001e4"
PHP는 문자열을 좋아하지 않습니다. 값을 숫자로 취급 할 수있는 변명을 찾고 있습니다. 해당 문자열의 16 진 문자를 조금씩 갑자기 변경 PHP는 더 이상 문자열이 아니라고 과학 표기법의 숫자 (PHP는 따옴표를 사용하지 않음)이며 숫자에 대해서는 선행 0이 무시되므로 동등합니다. 이 점을 강화하기 위해 PHP는 "01e4" == "10000"
동등한 값을 가진 숫자이기 때문에 PHP도 참으로 평가 됩니다. 이것은 행동으로 기록되어 있으며, 그다지 현명하지는 않습니다.
예약어를 없애려고 시도한 모든 언어 (예 : PL / I)에 대한 투표를하겠습니다.
합법적으로 다음과 같은 재미있는 표현을 쓸 수있는 곳은 어디입니까?
IF IF THEN THEN = ELSE ELSE ELSE = THEN
( IF
, THEN
, ELSE
변수 이름이다)
또는
IF IF THEN THEN ELSE ELSE
( IF
변수이고, THEN
및 ELSE
서브 루틴)
JavaScript 8 진 변환 '기능'은 다음 사항을 잘 알고 있습니다.
parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10
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);
}
}
while
끝에는 (조건부) JMP
다시 (조건부)입니다 do
. 이것은 왜 do
루프를 건너 뛸 수 있는지 설명합니다 .
이름으로 알골 패스 (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]);
}
def f(j : => int)
)
... 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]; } }); }
입니까?
파이썬에서 :
>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False
WTF는 아니지만 유용한 기능입니다.
(10 > 5 > 1) != ((10 > 5) > 1)
Python.
(funct_a(5)+5 > b > funct_a(5))
호출 funct_a(5)
합니다. 훌륭한 기능입니다!
funct_a
.이 예에서는 두 번 호출됩니다. 에서는 b > funct_a(5) > c
반대로 그것은 단지 한 번 생각 호출됩니다 b > funct_a(5) and funct_a(5) > c
.
자바에서 :
int[] numbers() {
return null;
}
다음과 같이 쓸 수 있습니다 :
int numbers() [] {
return null;
}
const T*
그리고 T const*
동일 T* const
합니다. 포인터를 구성하는 것입니다. 또한, 나는 산세 글꼴이 싫어.
numbers()[2]
법적인 진술입니다.
INTERCAL 은 아마도 가장 이상한 언어 기능에 대한 최고의 개요 일 것입니다. 개인적으로 가장 좋아하는 것은 COMEFROM 문장으로 GOTO와 거의 반대입니다.
COMEFROM은 코드의 임의의 지점에서 COMEFROM 문으로 실행 상태를 취할 수 있다는 점에서 GOTO와 반대입니다. 상태 전송이 발생하는 코드 포인트는 일반적으로 COMEFROM에 매개 변수로 제공됩니다. 전송이 지정된 전송 지점에서 명령 전후에 발생하는지 여부는 사용 된 언어에 따라 다릅니다. 사용 된 언어에 따라 동일한 출발점을 참조하는 여러 COMEFROM이 유효하지 않거나 비 결정적이거나 정의 된 우선 순위로 실행되거나 스레드 인터 칼에서 볼 수 있듯이 병렬 또는 동시 실행을 유발할 수 있습니다. "COMEFROM x"문의 간단한 예는 "트랩 도어"역할을하는 레이블 x (해당 COMEFROM 근처에 실제로 위치 할 필요는 없음)입니다. 코드 실행이 레이블에 도달하면 COMEFROM 다음에 오는 명령문으로 제어가 전달됩니다. 이것의 효과는 주로 디버깅 (및 프로그램의 제어 흐름 이해)을 매우 어렵게 만드는 것입니다. 레이블 근처에서 제어가 신비하게 프로그램의 다른 지점으로 이동한다는 표시가 없기 때문입니다.
PLEASE
수정자를 자주 사용하지 않으면 실제로 프로그램 컴파일을 거부 할 수 있습니다 !
실제로 언어 기능은 아니지만 구현상의 결점 : 일부 초기 포트란 컴파일러는 상수 풀을 사용하여 상수를 구현했습니다. 모든 매개 변수는 참조로 전달되었습니다. 예를 들어 함수를 호출 한 경우
f(1)
컴파일러는 상수 풀에있는 상수 1의 주소를 함수에 전달합니다. 함수에서 매개 변수에 값을 지정하면 프로그램에서 전체적으로 값 (이 경우 값 1)을 변경합니다. 머리가 긁혔습니다.
2+2
수 와 동일 5
(매우 큰 값을 2
물론!).
2+2
경우 동일 ). 5
5
2 + 2 = 5
; 그것은 구문 오류 일 것입니다. 사실은 2 + 2 .EQ. 5
입니다.
언어 기능으로 간주 될 수 있는지는 모르지만 C ++에서는 템플릿과 관련된 거의 모든 컴파일러 오류가 전세계의 많은 C ++ 프로그래머에게 매일 상당한 양의 WTF를 제공합니다. :)
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> >)
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);
}
파이썬의 전체 공백은 나의 가장 큰 WTF 기능이라고 말할 것입니다. 사실, 당신은 다소 후에 익숙해 져서 현대 편집자들은 다루기가 쉬워 지지만 지난 몇 년 동안 대부분의 풀 타임 파이썬 개발 후에도 여전히 그것이 나쁜 생각이라고 확신합니다. 나는 그 뒤에 모든 추론을 읽었지만 솔직히 내 생산성에 방해가됩니다. 많지는 않지만 여전히 안장 아래에 버입니다.
편집하다: 의견으로 판단하면 일부 사람들은 내 코드를 들여 쓰기를 원하지 않는다고 생각합니다. 그것은 잘못된 평가입니다. 언어와 강요 여부에 관계없이 항상 코드를 들여 쓰기했습니다. 내가 싫어하는 것은 한 줄의 코드가 들어있는 블록을 정의하는 들여 쓰기라는 것입니다. 나는 명시 적 구분 기호를 선호합니다. 다른 이유 중에서도 명시 적 구분 기호를 사용하면 코드를 쉽게 잘라 붙여 넣을 수 있습니다.
예를 들어, 4 칸 들여 쓰기 된 블록이 있고 8 칸 들여 쓰기 된 블록의 끝에 붙여 넣으면 붙여 넣은 코드가 8 칸 블록 또는 외부 칸에 속하는지 내 편집자 (모든 편집자?)는 알 수 없습니다. 블록. OTOH, 명시 적 구분 기호가 있으면 코드가 속한 블록과 코드를 어떻게 들여 쓰기 해야하는지 분명합니다. 블록 구분 기호를 지능적으로 찾아서 그렇게합니다.
편집 2 : 의견을 제공하는 일부 사람들은 이것이 내가 싫어하는 기능이라고 생각하거나 파이썬을 열악한 언어로 생각합니다. 다시 한 번 사실이 아닙니다. 나는 그것을 많이 좋아하지 않지만 요점 옆에 있습니다. 문제는 가장 이상한 언어 기능 에 관한 것입니다. 언어가 매우 적지 만 (0보다 큰) 언어를 사용하기 때문에 이것이 이상하다고 생각합니다.
나는 이것에 대해 조금 고투했다.
1;
perl에서 모듈은 true 를 반환해야 합니다 .
'Cogito ergo sum';
모든 사람이 알고있는 모든 우주에서 자명 한 사실을 거의 사용하지 않았습니다 . 이는 최대한의 이식성을 보장합니다."라고 말했습니다.
<?=1;?>
는 1을 <?=true;?>
반환합니다. 1을 <?=false;?>
반환합니다.
아무도 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
붙어 있기 때문에! 조건부 앞에있는 방법 이 너무 복잡!
While
와 Whend
" 로 만들었어야했다 . 그리고 물론 줄이 더 좋고 줄이있는 코드도 좋습니다.
모르는 사람들을 위해 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를 종료하지 않습니다.
bc
그 전에 사용 bc
했고 매뉴얼 페이지의 큰 따옴표 때문에 내 게시물에 글 을 쓰고 싶었습니다 .
echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(이미 이미 알고있을지라도).
나는 왜 가장 간단한 프로그램인지 궁금했습니다.
class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
반면에 :
print "Hello World!"
어쩌면 이것은 컴퓨터 과학 학생들을 처음에 두려워하는 것입니다 ...
JavaScript는 객체 지향입니다. 따라서 리터럴 문자열과 숫자에서 메소드를 실행하면 작동합니다. 좋아 "hello".toUpperCase()
하고 3.toString()
. 두 번째 것은 구문 오류라는 것이 밝혀졌습니다. 왜 그렇습니까? 파서는 숫자 다음에 점이 부동 소수점 리터럴이되기를 기대하기 때문입니다. 그것은 WTF가 아니며 WTF는 다른 점을 추가해야 작동한다는 것입니다.
3..toString()
그 이유는 리터럴이다 3.
로 해석 3.0
하고, 3.0.toString()
잘 작동합니다.
3..__add__(4)
). 그런 다음 다시 (3).__add__(4)
뇌 손상이 훨씬 덜 생각 합니다 :)
3.0.toString()
내 눈이 가려워집니다.
자바 스크립트에서 :
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]입니까?
===
대신 사용해야 합니다.
Number(n)
비슷한 것을 위해 . 불행히도 두 솔루션 모두에서 ===
= (.
가장 싫어하는 가장 큰 특징은 조건부 논리를 포함하는 구성 파일 구문입니다. 이런 종류의 일은 Java 세계에서 잘 알려져 있습니다 (Ant, Maven 등. 당신은 당신이 누구인지 알고 있습니다!).
제한적인 디버깅 및 제한된 편집기 지원을 통해 ac ** p 언어로 프로그래밍이 완료됩니다.
구성에 논리가 필요한 경우 실제 언어로 구성을 코딩하는 "Pythonic"접근 방식이 훨씬 더 좋습니다.
powerbasic (www.powerbasic.com)에는 컴파일러 지시문이 포함되어 있습니다.
# BLOAT {bloatsize}
컴파일 된 실행 파일의 크기가 <bloatsize>
바이트 단위로 증가합니다 . 이것은 실행 파일을 만드는 사람들이 생성 된 실행 파일의 작은 크기를 좋아하지 않는 경우에 컴파일러에 포함되었습니다. 그것은 부풀어 오른 프로그래밍 언어와 경쟁하기 위해 EXE가 더 크게 보이게합니다 :)