i, j = 1이 실제로 오도됩니까? [닫은]


11

하나의 라이너에 여러 변수 초기화에 대한 일반적인 주장이 있습니다.

예를 들어 int i, j = 1; 어떤 사람들은 두 변수가 모두 초기화되고 있다고 착각하게 만들 수 있습니다.

우리는 누군가가 그것에 대해 오해하지 않기 위해 그의 언어의 구문을 충분히 알아야한다고 주장 할 수 있습니다. 또 다른 논거는 개발자로서 우리는 너무 많은 언어를 배우면서 언어 간의 특정 성 사이에서 실수를 할 수 있습니다.

그러나 매우 구체적인 경우에는 다음 구문이 i, j = 1 인 두 변수를 모두 초기화 하는 언어가 존재하는지 궁금합니다 .

그 주장이 아니라면 적용되지 않습니다.


2
언어가 제정신 일 경우 초기화되지 않은 변수에 액세스하면 컴파일러 오류가 발생하기 때문에 혼동이 발생할 수 있습니다.
코드 InChaos

4
@CodesInChaos C가 제정신이 아니라고 말하는가?
Baldrickk

2
언어가 무언가를 허용한다고해서 인간에게 불필요한 고통을주지 않는 것은 아닙니다. 이 코드가 필요한 유일한 장소는 언어 사양을 암기하지 않은 사람들을 처벌하기 위해 고안된 퀴즈입니다. 나는 항상 이런 유형의 질문에 실패했습니다. 블리.
candied_orange

2
Visual Basic 6 Dim Apple, Orange, Pear as Fruit에서는 법적 선언입니다. VB를 모른다고 가정하십시오. 첫인상이 Apple유형 Fruit입니까? 그렇지 않습니다. 언어는 종종 해당 언어의 전문가가 아닌 사람들이 읽습니다. 전문가라면 언어를 현명하게 사용하여 비전문가에게도 의도를 명확하게 전달하십시오. 어떤 언어로도 여러 초기화를 사용하지 않습니다.
Eric Lippert

13
비슷하게 : 고려하십시오. var x = 1, y = 1.5; 이것은 같 int x = 1; double y = 1.5;거나 같 double x = 1, y = 1.5;습니까? 우리 var가 C # 3.0에 추가했을 때 나는 여론 조사를하고 사람들의 약 절반이 첫 번째가 "분명히"정확하다고 믿었고 다른 절반은 다른 것이 "분명히"옳다고 믿었고, 그래서 우리는 그것을 불법으로 만들었습니다. 인구의 절반을 잘못 인도하는 기능은 나쁜 기능입니다.
Eric Lippert

답변:


37

나는 생각하지 않지만 그게 요점이 아닙니다. 요점은 즉 i, j = 0아주 쉽게 오해입니다 i = j = 0, 어떤 않습니다 모두 초기화합니다. 명확성은 소스 코드에서 정확성 옆의 가장 중요한 요구 사항이며,이 질문이 제기된다는 사실은 명확성이 차선 책임을 증명합니다.


3
또한 그러한 진술이 두 진술을 모두 초기화 하지 않으면 왜 존재 하는가?
Berin Loritsch

2
@BerinLoritsch는 언어에 따라 다릅니다. 이는 선언 게양 때문에 JavaScript에서 자주 수행됩니다. 코드에서 사용되는 지점까지 변수를 초기화하지 않더라도 변수를 사용할 수있는 범위의 상단에서 변수를 선언하는 것이 많은 사람들이 모범 사례로 간주합니다. . 거의 모든 코드 변환 도구가이 방식으로 출력됩니다.
Jared Smith

1
코드 출력 도구 가이 작업을 수행 한 경우 신뢰할 수 있어야한다고 생각합니다. 그러나 인간에게는 마지막 요소의 선언과 초기화를 한 줄로 결합하는 것이 좋습니다. 버그가 발생하는 것처럼 보입니다.
Berin Loritsch

2
@JaredSmith 메이플 외에도 현재 원하는 언어를 생각할 수 없습니다 .C조차도 잠재적으로 버그를 막을 수있는 이점을 제공하고 기능이 변경되지 않는 한 변수로 수행 할 작업을 결정하는 컴파일러로, 레지스터 수가 적을수록 더 나은 최적화가 가능합니다.
whn

6
에 관계없이 언어의 하나 "는 무엇 요청해야 이익을 쓰기의 int i, j=1int i; int j = 1(또는 더 나은, 별도의 라인)?"
chepner

2

나는 당신이 어느 쪽을 주장 할 수 있다고 생각합니다.

  • KONTRA i, j = 0:
    수학자는 모두 뜻이를 사용 할 i과가 j제로로되어있다.

  • Pro i, j = 0:
    운영자의 우선 순위를 아는 것은 간단합니다. 그리고 당신이 그들의 우선 순위에 대해 의심 스러우면 지금 찾아야 할 때입니다.

    우리 a.b += c[i]*d[i];가 괄호없이 물건을 쓰는 이유도 마찬가지 입니다. 물론 이것은와 동일 (a.b) += ((c[i])*(d[i]));하지만 프로그래머는 가장 많이 사용하는 연산자의 우선 순위를 알고 있어야하며 확실하지 않은 연산자의 우선 순위를 찾을 수 있습니다. 따라서, 괄호는 연산자 우선 순위가 규정 한 것과 다른 평가 순서를 강요하지 않는 한 일반적으로 쓸모없는 혼란으로 간주됩니다.

    물론 예외가 있습니다. 의 우선 순위 <<와는 +일반적으로 어느 경우에 warant 괄호에 모호한 충분히 고려된다. 그러나 그것은 규칙을 증명하는 예외입니다.

나는 프로 측에 더 많이 빠질 것이지만, 그러한 선언을 금지하는 스타일 가이드를 고수 할 준비가되어있다. 싸울만한 가치가 없습니다.


7
나는 그 안에 연산자int i, j = 0; 가 없다는 것을 알고 있습니다 . 유일한 표현 한다는 점에서 이다 따라서 연산자 우선 순위는 그것으로되지 않습니다. 파서는 쉼표 연산자 나 대입 연산자 로 취급하지 않습니다 . 오히려 이들은 선언문의 문법 부분입니다. 0,=
Eric Lippert

@EricLippert 우선 순위 규칙에 관한 한 그 차이는 무의미합니다. 내가 아는 C 스타일 언어는 선언에서 다른 표현식과 같은 우선 순위를 사용합니다. 다른 것들은 데스 터 스터를 초대 할 것입니다.
cmaster-monica reinstate

but programmers can be expected to know the precedence of the most used operators by heart그렇습니다. 예를 들어, 대부분의 (평균) 프로그래머가 멤버 액세스 연산자 또는 배열 인덱스 연산자를 수학적으로 연산자라고 생각하지는 않지만 자연 언어 명사 및 곱셈으로 생각하십시오. 동사로서의 연산자. 그것이 int i, j, k = 0;"int 변수 i, j, k가 선언되고 0으로 설정 될 것"의 자연어 유사체로서 제시되기 때문에, 그러한 기묘한 구성은 왜 그런가 !
Steve

@Steve 프로그래머로서 우선 순위 규칙을 기억하는 방법은 전적으로 귀하에게 달려 있습니다. 언어의 명사로 생각하는 데 도움이된다면 그렇게하십시오. 그러나이 경우와 같은 것을 볼 때 문제가 발생 *a[i]하므로 "명사"유추로 충분히 구문 분석 할 수 없다고 생각합니다. 에 관해서 int i, j, k = 0;는 규칙을 찾지 않으면 무엇이든 의미가 있습니다. 세 번째 해석은 선언 int i하고 평가 j하고 마지막으로 할당하는 것 k = 0입니다. 언어의 구문을 모르면 그러한 구문을 구문 분석 할 수 없습니다. 어쨌든 당신의 문제입니다.
cmaster-monica reinstate

@ cmaster, 나는 나의 특정한 암기 전략 하하를 표현하지 않았다. 나는 C 프로그래머가 아니므로 C의 연산자 우선 순위에 대한 나의 친숙 함은 두 번째입니다. 그러나 귀하의 예를 살펴 보았을 때 주목 한 것은 곱셈 연산자가 배열 인덱스 연산자에 상대적 우선 순위를 갖는 것으로 생각하지 않았다는 것입니다. 즉,에 a[i]적용된 인덱스 연산자로 a읽지 않았지만 곱셈 연산자의 피연산자를 지정하는 돌이킬 수없는 구문 요소로 함께 읽었으므로 우선 순위를 평가하라는 메시지가 표시되지 않았습니다. (1/2)
Steve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.