2011-03-16 4 views
1

예를 들어, C/C++에 다음 코드를 안 함 :"매직 넘버"의 개념이 언어마다 다릅니 까?

int foo[] = {0, 0, 0, 0}; 

없음 매직 넘버를 오른쪽?
자,의 파이썬 "상응하는"것 : 아직도

foo = [0, 0, 0, 0] 

마법의 숫자.

foo = [0] * 4 

을 그리고 지금 우리는 매직 넘버를 수행합니다
그러나, 파이썬에서, 그 같은 일이 같이 쓸 수 있습니다. 아니면 우리?
나는 다른 언어와 함께 이와 비슷한 것들을 추측하고 있습니다.

+6

나는 당신이 무슨 말을하고 있는지 전혀 모른다. –

+0

여기에 질문이 뭐니? – AbiusX

+3

나는 이것이 닫힐 가치가 있다고 생각하지 않지만, 나는 또한 질문의 질을별로 생각하지 않는다. 좋은 대답을하는 것은 너무 구체적이지 않습니다. – Omnifarious

답변

11

모든 번호가 magic constant 인 것은 아닙니다. 이유가 4이고 0이 4 개의 마법 숫자 인 이유는 (어느 언어로든) 이 왜 4이고 다른 숫자가 아닌지 확실하지 않다는 것입니다. 이 숫자가 어디에서 왔는지 보는 것은 매우 쉽다 때문에 잘 여섯 양면 알려진 재생됩니다 게임의 맥락에서 예를 들어

def roll_die(): 
    return random.randint(1,6) 

이 코드는 더 매직 넘버가 없습니다 죽는다.

반면에 다른 프로그래머가 알고있는 숫자를 추측하기는 어려울 수 있습니다. 예를 들어, 모든 사람이 갑판에있는 카드의 수를 알고있을 수는 없으므로 명명 된 상수를 거기에 사용하는 것이 더 합리적입니다.

숫자가 "마법"인지 여부는 전적으로 문맥에 따라 다르며 언어와는 아무런 관련이 없습니다. 의심 스러우면, 당신의 상수를 그냥 안전한쪽으로 지명하십시오.

+0

질문에 대한 좋은 대답은 +1입니다. – pmg

+7

"die"의 특정 값에 대해 die에 4, 6, 8, 10, 12 또는 20면이 있습니다. –

+0

DnD 괴상한 경우 +1. ;-) –

5

그게 어떻게 (C 또는 C++)에서 다르다 :

int foo[4] = {0}; 

?

이 경우 배열의 크기는 매직 번호입니다.

+0

그래서 우리는 리터럴을 사용할 때 암시 적으로 하나를 사용하지 않기 위해 마술 번호가 무엇인지에 대한 정의에서 배열 크기를 명시 적으로 제외해야합니다. –

+0

@ 양의 양 : 이니셜 라이저에 구조가있는 경우 크기는 더 이상 "마법"이 아니지만 의미가 있습니다. 그러나 여기서 보이는 구조는 없으며 크기는 임의적으로 보입니다. –

+1

'int foo [4] = {1};을 제외하고; // [1,0,0,0]'반면에'foo = [1] * 4 // [1,1,1,1]' –

0

마술 숫자는 도메인 값 (계산 요소, 매핑 요소의 색인에 사용됨)입니다. 그 (것)들의 아이디어는 어떤 언어든지에서 일관되다. 귀하의 예에서는이 배열이 무엇인지에 따라 다릅니다.

-1

귀하의 모든 질문은 귀하의 프로그램에서 "매직 넘버"의 개념과 "매직 넘버"사용에 대한 규칙은 완전히 완전히 바보입니다. 매직 넘버에 대한 규칙은 자신이하는 일을 이해하지 못하는 사람들, 동의해야하거나 서로 의존하는 여러 장소 값의 하드 코딩에 대한 훨씬 건전한 규칙에 대한 나쁜 접근입니다.예를 들어,이 코드는, 버퍼 길이가 프로그램이나 현실 세계에서 아무것도 일치 할 필요는 없습니다만큼 완벽하게 합리적이다 :

char buf[100]; 
snprintf(buf, sizeof buf, ...); 

을하지만이 코드는 매우 나쁜 :

char buf[100]; 
snprintf(buf, 100, ...); 

물론 현실 세계에서는 아마도 입니다. 버퍼 크기를 일치시키려는 것입니다. 예를 들어 특정 크기의 정수를 인쇄하는 데 필요한 최대 자릿수입니다. 이 경우에, 당신은 같은 것을 할 수 있습니다 :

char buf[3*sizeof(int)+3]; 
snprintf(buf, sizeof buf, ...); 

을 그리고 당신은 변수로 CHAR_BIT을 고려한다면 당신은 CHAR_BIT의 측면에서 공식 3을 대체 할 수 있습니다. 어쨌든 표현에 나타나는 상수는 "악마의 매직 넘버"가 아닙니다.

예제에서 배열의 차원이 다른 변수에 종속되어있는 경우 배열 정의 중 세 가지 모두 나쁜 습관입니다. 그러나 만약 당신이하고있는 일에 차원 4가 근본적이라면, 나는 그것을 잘못 본 것이 없습니다.

물론 코드 수명 기간 동안 당신이하는 일은 때로는 바뀔 수 있지만, 그게 바로 문서의 목적입니다. 코드는 어느 정도의 수정 없이는 미래에 가능한 목적 변경을 처리 할 수 ​​없으며, 원래 목적과 계약이 무엇인지를 문서화하는 한, 코드의 일부를 찾는 누군가를 변경하는 것이 어렵지 않아야합니다 그것은 변화가 필요합니다.

+3

@R : 두 번째 코드 단편은 첫 번째 코드 단편보다 확실히 나쁘지만, 개인적으로 합리적인 것도 없습니다. 첫 번째 스 니펫은 여전히 ​​버퍼의 길이가 '100'인 이유를 읽는 사람에게 정보를 제공합니다. 즉, 정보는 코드의 아무 곳에도 포함되어 있지 않습니다. 그것은 중요하지 않을 수도 있지만 독자는 그 사실을 모르고 있습니다. 한 가지 방법이나 다른 방식으로 알려주는 것이 중요합니다. (명명 된 상수를 사용하거나 적어도 코멘트에서는 ...) 가정을 설명하지 않는 코드 사람들의 시간 낭비와 나중에 불필요한 버그가 발생할 수 있습니다. –

+0

100에서 256 중 일부 **를 256으로 변경해야한다는 요구 사항이 생기면 어떤 것을 변경해야하는지 어떻게 알 수 있습니까? –

+0

제 3의 예에서 그 내용을 철저히 따랐습니다. 크기가 무엇이든 관계없이 명시적인 상수 공식이 가장 좋습니다. –

0

아래 코드를 참조하십시오. 그것은 C 언어 기능입니다.

int arr[] = { [0 ... 4]=3,[7]=7,[8 ... 12]=12,[15]=0}; 

동일

로서 INT [] = 도착이다 {3, 3, 3, 3, 3, 0, 0, 7, 12, 12, 12, 12, 12, 0, 0, 0};