2011-10-27 1 views
2

제 자바 서적에서 "표현식은 반환 값을 전달할 수있는 명령문입니다"라고 말합니다. 이것은 제 전통적인 이해와 다릅니다. 표현식이 값을 반환한다고 생각했습니다. CAN은 값을 반환 할 수 없습니다."표현식"의 정의

이것은 21 일 동안 Sams Teach Yourself Java에서 온 것입니다.

+1

이 책에는 다른 혼란스러운 부분이 많이 있습니다. 나는 매우 문자 적이며 기술적 인 방식으로 생각합니다. 그래서 나는 모호성을 남기고 자하는 기술적 인 글들을 무시합니다. – Michael

+1

'NDS에서 자신을 가르쳐라'는 책은 용의주도하고, 더 좋은 책을 얻고, 그 해에 인쇄 된 책은 무엇인가? –

+0

인쇄 된 2007 및 2009 – Michael

답변

3

수학 표현식은 항상 결과를 반환하지만 Java 표현식은 필요하지 않습니다. Java Specification은 what exactly is meant by the term expression in the Java language을 정의합니다. 또 다른 차이점은 표현식이 Java에서 부작용을 가질 수 있고 종종 그렇습니다. 부작용은 값을 반송하는 것보다 기타이 발생하는 것입니다.Java 언어 사양을 인용

는 : 프로그램에서 작업

대부분은 식을 평가하여 수행됩니다, 사용할 수있는 하나 같은 변수에 할당, 또는 그 값에 대한 그들의 부작용에 대한 큰 표현식에서 인수 또는 피연산자로 사용하거나 명령문에서 실행 순서에 영향을 주거나 둘 다.

예를 들어 system.out.println("Hello World");은 값을 반환하지 않지만 Hello World을 출력 스트림에 인쇄합니다. 이 데이터 출력 프로세스는 println 호출의 부작용입니다. 대조적으로 Functional languages은 부작용에 대한 의존성을 최소화하고 표현식의 수학적 정의에 더 가깝게 노력합니다.

Quoting from the JLS 다시 여기에 표현의 BNF grammar입니다 :

Primary: 
    PrimaryNoNewArray 
    ArrayCreationExpression 

PrimaryNoNewArray: 
    Literal 
    Type . class 
    void . class 
    this 
    ClassName.this 
    (Expression) 
    ClassInstanceCreationExpression 
    FieldAccess 
    MethodInvocation 
    ArrayAccess 

당신은 MethodInvocationPrimary (표현)의 확장입니다 PrimaryNoNewArray의 확장이라고 볼 수 있습니다.

+0

은 system.out.println ("whatever")이 아닙니다. 성명서로 간주 되나요? 나는 표현이 또한 문장으로 간주된다는 것을 알고 있지만, 나는 또한 그들이 뭔가를 반환했다고 생각한다. – Michael

+0

system.out.println()은'PrimaryIn' 인'PrimaryNoNewArray' 인'MethodInvocation'입니다. [명세서] (http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#32584)는 완전히 다른 것입니다. 제발 자바와 수학 사이의 용어의 유사점에 매달 리지 마라. JLS는 용어를 매우 조심스럽게 정의합니다! – ObscureRobot

+0

반론은 내 답변을 참조하십시오. –

2

이해가 불완전합니다. Java에서 표현식 값을 반환 할 수 있으며 이 예외로 종료 될 수 있습니다. 비슷한 상황이 예외를 지원하는 다른 언어에서도 발생합니다. (예를 들어, C 언어, 0으로 나누기 현재 발현 평가 값을 리턴하지 않고 종료시킨다.)


다른 설명 해당합니다 (JLS 항)이며, System.err.println("hello") 같은 메소드 호출의 표현 수 컨텍스트에 개념적으로 void 값을 전달하십시오. 이는 실제로 가치를 제공하지 않는다는 것을 의미합니다.

나는이 두 번째 설명이 소리라고 생각하지 않습니다. void 값을 전달하는 것으로 지정된 "표현식"으로 시작합니다. 그렇다면 무효 가치가 실제로 가치가 아니기 때문에 그 표현은 아무 것도 전달하지 못한다고 주장합니다. 마지막으로, 우리는 이것이 가치가없는 표현이라고 말합니다.

이 예제에 대한 더 간단한 설명은 "void"를 전달하는 "표현식"이 실제로 직관적 인 의미의 표현식이 아니라는 것입니다. 물론 Java에서는 void 전달이 아닌 표현식이 필요한 경우 void 전달 MethodInvocation 표현식을 사용할 수 없습니다. 그리고 귀하는 진술로서 비 공표 전달 표현을 사용할 수 없습니다.

또는 JLS 처리를 계속 사용하여 "무효"값이 실제로 가치가 있다고 말할 수 있습니다. 아무리해도 아무 것도 할 수 없지만 말입니다. 이 인수에 의해 System.err.println("Hi")은 결국 값을 반환하는입니다.

+0

실제로 "가치를 전달할 수 있습니다."라고 말합니다. 어쩌면 그것이 더 합리적인 것입니다. – Michael

+3

@Micheal - 문제는 책이 아니라 "전통적인"이해입니다. –

0

메서드 public void foo();은 아무 것도 반환하지 않으므로 foo()이라는 식은 아무 것도 반환하지 않습니다. 그러나 그 방법이 public int foo()이라면 그럴 것입니다. 따라서 을 반환 할 수 있지만 반드시 그런 것은 아닙니다. From the Java spec :

표현식이 무효 선언 하는 방법, 즉, 값을 반환하지 않는 메소드를 호출하는 메소드 호출 경우에만, 아무것도 의미하지 않는다. 표현식이 일 수있는 모든 다른 컨텍스트에는 표현식이 필요하기 때문에 이러한 표현식은 표현식 문으로 만 사용될 수 있습니다. 메서드 호출 인 식 은 이 결과를 생성하는 메서드를 호출 할 수도 있습니다. 이 경우 메서드에 의해 반환 된 값은 입니다.

0

아야 ... 이것은 매우 좋은 책 :(

식처럼하지 않는 것 중 하나 유형을 가지고 있으며, 해당 유형의 값을 산출하기 위해 평가 될 수있다, 또는 void 유형이며이 될 수 있습니다 아무런 결과도 얻지 못한다고 평가하는 경우 JLS은 표현식이 변수로 평가 될 수 있다고하지만 변수는 유형과 값을 갖습니다. 예를 들어 1 + 1은 표현식입니다

예를 들어 int x = 1 + 1;은 값이 없습니다. Java에서는과 같은 것을 말하면 이해할 수 없습니다.