2013-06-17 2 views
3

단순히 왼쪽에서 오른쪽으로 평가하지 않는 이유는 무엇입니까? 우선 순위에 따라 코드를보다 쉽게 ​​읽을 수있는 방법을 설명 할 수 있습니까? 내게는 더 많은 생각과 오류 가능성이 필요해 보인다. 아인슈타인은 "모든 것은 가능한 단순하게 만들어야하지만 더 간단하지는 않다"고 말했다. 그가 프로그래머가 아니었던 것 같아요. 14언어가 연산자 우선 순위를 갖는 이유는 무엇입니까?

+2

수학, 연산자 우선 순위에도 적용됩니다! – NINCOMPOOP

+1

우리 나라의 7 학년 때 운영자 우선 순위가 배웁니다. 컴퓨터 프로그래머는 IMO 교육 수준 이상이어야합니다. – Omar

+0

어떤면에서는 사실이지만 다른면에서는 그렇지 않습니다. 아이들은 수학을 모른 채 프로그램을 쓸 수 있습니다. 모차르트는 3 세 때 여전히 연주되는 곡을 썼습니다. 프로그래밍에 많은 교육이 필요하다는 암시를 좋아하지 않습니다. 사실이 아닙니다. –

답변

0

운영자 우선 순위는 다음 평가합니다

2 + 3 * 4 

는 이럴, 20 뜻밖로 평가없이 것이다.

+0

나에게 정의 할 수 있기 때문에 "기대하는"것은 아무것도 없습니다. SIMPLER는 무엇을 이해해야합니까? 그것이 예상되는 것이어야합니다. 2 명의 연산자가있는 장난감 식은 시스템을 모델링하는 방법이 아닙니다. 내가 찾을 수 있었던 모든 대답은 다음과 같습니다. A) 작은 문장 (코드 줄)으로 나눕니다. B) 혼동이있을 수있는 경우 괄호를 사용하십시오. 그렇다면 단순하게 말하면 안됩니다. 기간 - 물음표? 우리에게 우선 순위는 무엇입니까 - 심문? 그것은 무엇을합니까 ??? –

+0

L에서 R로가는 것은 수학 표현식이며 수학 표현식의 표준이기 때문에 예기치 않게됩니다. 이상한 것을 발견하면 컴퓨터 프로그래밍 방법을 배우기 전에 수학을 배우십시오. – Omar

+0

수학과 프로그래밍은 서로 관련이 없다고 생각합니다. 99 %의 시간 프로그래밍은 순차적으로 일을하고 결정을 내리는 것에 관한 것으로, 이는 수학의 일부가 아닙니다. 이것이 요리와 관련된 조리법이 수학이 아니며 조리법이 알고리즘이 무엇인지 보여주는 # 1 예입니다. 저는 수학 학위를 가진 요리사를 모르며, 5 학년 학생들이 할 수있는 것보다 훨씬 적은 프로그래밍을 가지고 있습니다. 그러나 우리는 그들이 똑같다고 생각하는 것 같습니다. 나는 그것을 보지 않는다. 그들이 너무 다른 경우, 다르게 대우하십시오. –

5

수학에서 컴퓨터 언어가 발명되기 전에 연산자 우선 순위가 있기 때문에

2 + 5 * 3 = 17 (and not 21) 

는 언어 혼란을 생성하는 것 + 연산자에 대한보다 * 운영자에 대한 더 높은 우선 순위를 가지고 있지.

++ C의 또 다른 예 : * 운영자가 << 연산자보다 우선 순위를 가지고 있지 않은 경우

std::cout << 7 * 8 << std::endl; 

,이 컴파일되지 것입니다 :

  • std::cout << 7가 먼저 평가 될 것이다, A와 std::cout를 산출 결과 (7이 인쇄 될 부작용이 있음)
  • 그러면을 평가하고 싶습니다.- 누군가가 정말로 이상한 연산자를 정의하지 않는 한 outputstream에 정수를 곱하면 *이 정의되지 않습니다.

연산자 우선 순위는 (나는 그들이 실제 우선 순위를 가지고 인식하지 않기 때문에 어떤 경우에는 사람들이 버그를 소개하는 것에 동의하지만) 지금


을 '상식 내에서'불필요한 괄호를 넣어하지 않아도 허용 질문 : 왜 수학은 연산자 우선 순위가 있습니까? This wikipedia article은 역사적인 사실을 언급하고 a discussion forum으로 연결됩니다. 나에게있어서, 중요한 인수는 다항식을 작성할 때 예를 들어.

1+2/3 

: 더 연산자 우선 순위가 없다면

(a(x^2)) + (bx) + c 
+0

그래서 어떤 점에서 함께 모이는 두 개의 "평가의 흐름"이 있다는 사실과 관련이 있습니까? 귀하의 예에서, 괄호의 첫 번째 부분과 괄호의 두 번째 부분은 독립적이며 첫 번째 플러스가 평가되기 전에 둘 다 "발생"합니다. 나는 그것을 분리 된 문장으로 분해하고 그것이 복잡한 것이라면 임시 변수를 사용할 것이라고 생각한다. 그렇게 어려운가요? –

+0

당신은 단순함을 언급하면서,'ax^2 + bx + c'가 (우선 순위의 일부 규칙에 동의하는 가격으로) 쓰기가 더 간단하다고 주장합니다. 당신은 '별도의 진술로 분해하라'는 말은 이해하기가 더 쉽다고 말합니다 (더 많은 것을 읽고 쓰는 댓가로). 두 가지 방법 모두 약간의 의미에서 더 간단합니다. –

+2

방정식을 보는 이러한 방법 중 _ 정사각형을 완성하는 것이 더 자연스럽지 않습니까? 괄호 안의 하나. 중요한 수학적 구조는 임시 변수를 사용하여 상실됩니다. 다항식의 최적의 _ 평가 _가 Horner의 규칙을 사용한다는 것은 사실이지만 그것은 괄호 안에있는 정글입니다 ... –

0

는이 표현을 평가하는 것입니다 방법, 예를 보자

연산자 우선 순위없이
ax^2 + bx + c 

, 하나는 그들을 작성해야 음, 어떤 사람들은 1+2의 합을 3으로 나누고 싶다고 말합니다. 추가하려는 기타 2/3 ~ 1!

+0

L 2 R! 젠장! –

1

디지털 세계는 단순히 괄호, 지수, 나눗셈, 곱셈, 덧셈, 뺄셈 등의 규칙 인 BEDMAS 규칙이 적용되는 구식 "실제"세계를 단순히 따릅니다.현실을 refedefine와 프로그래머가

(1 + 2) * 3 = 9 

v.s.로

1 + 2 * 3 

을하고 끝낼려고보다

더 나은

은 현실 세계를 따르도록 realworlder

1 + (2 * 3) = 7 

을하고 누군가가 잘못 "1을 수행"때문에 잘못된 대기 강하 프로필에 수백만 달러 프로브를 전송.

+1

... 거의 발생하지 않았습니다. http://en.wikipedia.org/wiki/Mars_Climate_Orbiter –

+0

예. 마일 v.s. 킬로미터 또는 무엇인가. 또는 그것은 v.s 파운드였습니다. 킬로그램? 어느 쪽이든, 믿을 수 없을 정도로 사소한 실수. –

+0

파운드 - 초와 뉴턴 - 초 –

2

우선 순위의 목적은 (a) 표준화하고 (b) PEMDAS와 같이 수학에 설정된 표준을 유지하는 것입니다.

+0

프로그래밍하기 수 백 년 전에 진화 한 완전히 다른 영역에서 표준을 유지하십시오. 왜? –

+0

@AndrewLazarus 그는 합법적 인 질문을 가지고 있습니다. 왜, 표준화되지 않았지만 충전기처럼 될 수있는 세계에 대해 생각해보십시오. 모든 것을 맞추는 충전기가 하나 있다면 많은 도움이됩니다. 이것은 기본적으로 똑같은 일입니다. 2 + 3 * 4는 수학에서 한 가지를 의미하고 프로그래밍에서 다른 것을 의미합니다. –

+1

@ Dgrin91, 나는 질문에 신경 쓰지 않지만 그의 후속 의견은 다른 어떤 것보다 논쟁의 여지가 많습니다. –

2

APL에는 연산자 우선 순위 (괄호는 제외)가 없습니다. 코드는 오른쪽에서 왼쪽으로 읽습니다 (예 : 히브리어 또는 아랍어). 즉, APL은 틈새 시장의 언어이며, 이것이 이유 중 하나입니다. 이미 다른 답변이 지적한 것처럼 대부분의 다른 언어는 오랜 기간 설정된 산술 규칙을 모방합니다.이 규칙은 일반적인 사용 사례 (즉, 실제 문제)를 모델링 할 수있는 방법에서 발생하는 것처럼 보입니다. 괄호.

+0

OK, 수학은 Shift, dereferencing, boolean 운영자 등이 포함될 수 있습니다. 언어는 십여 개 이상의 우선 순위 수준을 가질 수 있습니다. 실제 사람이 사용하려고했던 시스템에는 정상적인 사람이 참여할 수 없습니다. 그것은 말하고있는 것과 같습니다 : 10 개의 흠집이 벼랑에서 사라졌습니다. 더 많은 것이 항상 더 나은 것은 아닙니다. 어떤 시점에서 우리는 중단을 선언해야하며, 아니, 포리스트가 그 방향으로 너무 생각하고 있다고 말해야합니다. BASIC이 "시작에서 다시 시작"또는 "그냥 다시 시작 하시겠습니까?" –

+2

다시 한 번 가장 우선적 인 사용 사례에서 수동 그룹화 (즉, 괄호)의 필요성을 최소화하기 위해 선행 테이블을 선택하는 것이 좋습니다. 이것이 깨진 사례를 원한다면 C++ 스트림에서 오버로딩 된 삽입 연산자로'<<'를 사용하려면 우선 순위가 비트 시프트에 더 적절하기 때문에 괄호가 필요합니다. C/Java 우선 순위 테이블이 너무 복잡하다면 아무도 중복 괄호 삽입을 막지 못합니다. 까다로운 경우에는 이것이 바람직하고 표현식의 구조를 강조하는 것이 바람직하다고 생각합니다. –

1

APL과 같은 우선 순위 규칙을 없애거나 더 정확하게 하나의 규칙 만 사용하는 것이 가능합니다.

"함수의 오른쪽 인수는 해당 함수의 오른쪽에있는 전체 식의 결과입니다. 간단하고 일관된 재귀 우선 규칙이 있습니다." "J"(APL이 변형)에

예를 들어

:

1+2*3 => 7  Computed as 1+(2*3) 
    2*3+1 => 8  Computed as 2*(3+1) 

APL (그리고 J)가 많은 사업자, 그것은 각각의 우선 순위와 규칙을 기억하기 어려울 것하고 모두들.

+0

"1 2 3 many"나는 그것이 두껍게 빨리된다고 생각합니다. C에서와 같이 12 단계는 너무 많아 직선을 유지할 수 없습니다. 흉상. 한 문장을 다르게 쓰는 것보다 차트를 참조하는 것이 더 많은 시간을 낭비합니다. –

1

연산자 우선 순위가있는 이유는 전체 숫자가 2*4 인 것과 같아야하기 때문입니다.

따라서 2*4이없는 방식으로 생각할 수 있습니다. 단순히 8입니다.

그래서 기본적으로 다음과 같이 합계를 "단순화"합니다. 2+10*2 기본적으로는 2+20입니다.

다음 합계와 같습니다 : 2143+8^2+6^9. 2143+262144+10077696을 쓰고 싶지 않습니다. (그리고 당신이 훨씬 더 큰 공식을 가지고 있다면 이것이 어떻게 생겼는지 상상해보십시오.)

기본적으로 합계의 모양을 단순화하는 것입니다. 그리고 덧셈과 뺄셈은 가장 기본적인 연산 유형입니다. 이것이 바로 우선 순위가있는 이유입니다. 합계의 가독성을 높이는 것입니다.

내가 말했듯이, +- 연산자가 가장 기본적인 연산자이므로, 먼저 "복잡한"연산자를 먼저 해결하는 것이 좋습니다.

+0

확인. 그러나 프로그래밍에 많은 운영자가 있으며 결국에는 시각적 단서와 두뇌 파워가 나옵니다. 그렇다면 너무 무거워서 들어 올릴 수없는 돌을 만드는 이유는 무엇입니까? –

+0

이 핸드 웨이브는 아무 것도 설명하지 않습니다. – EJP

+0

@EJP 좋습니다. 그렇다면 이것이 당신에 따른 이유가 아니라면, ** 그들은 왜 당신에 따라 존재합니까? "진짜"대답은 수학에서 비롯된 것이 분명합니다. 다른 모든 대답은 수학에 왜 그들이 "발명 된"이유인지에 대한 명확한 이유를 제시하지 못합니다. 그렇다면 당신의 대답은 무엇입니까? – w00

관련 문제