문제

C#에 관해 질문하고 있지만 대부분의 다른 언어에서도 마찬가지라고 가정합니다.

누군가에 대해 좋은 정의를 가지고 있습니까? 표현 그리고 진술 차이점은 무엇입니까?

도움이 되었습니까?

해결책

표현: 가치로 평가되는 것.예: 1+2/x
성명: 어떤 작업을 수행하는 코드 줄입니다.예: 100으로 가세요

FORTRAN과 같은 최초의 범용 프로그래밍 언어에서는 그 차이가 매우 명확했습니다.FORTRAN에서 명령문은 사용자가 수행한 실행 단위 중 하나였습니다."라인"이라고 부르지 않은 유일한 이유는 때때로 여러 라인에 걸쳐 있기 때문입니다.표현 자체로는 아무것도 할 수 없습니다 ...변수에 할당해야 했습니다.

1 + 2 / X

아무것도 하지 않기 때문에 FORTRAN의 오류입니다.그 표현으로 뭔가를 해야 했어요:

X = 1 + 2 / X

FORTRAN에는 오늘날 우리가 알고 있는 문법이 없었습니다. 이 아이디어는 Algol-60 정의의 일부로 BNF(Backus-Naur Form)와 함께 발명되었습니다.그 시점에서 의미론적 구별("가치가 있다"와 "뭔가를 한다")이 명시되어 있었습니다. 통사론:한 종류의 문구는 표현식이고 다른 문구는 명령문이며 파서는 이를 구분할 수 있습니다.

후기 언어의 설계자들은 구별을 모호하게 만들었습니다.그들은 구문 표현이 어떤 일을 할 수 있도록 허용했고, 가치가 있는 구문 진술을 허용했습니다.아직까지 남아 있는 가장 초기의 대중적인 언어 예는 C입니다.C의 설계자들은 표현식을 평가하고 그 결과를 버리는 것이 허용된다면 아무런 해가 되지 않는다는 것을 깨달았습니다.C에서는 끝에 세미콜론을 붙이기만 하면 모든 구문 표현을 명령문으로 만들 수 있습니다.

1 + 2 / x;

아무 일도 일어나지 않을지라도 완전히 합법적인 진술입니다.마찬가지로 C에서는 표현식이 다음을 가질 수 있습니다. 부작용-뭔가를 바꿀 수 있습니다.

1 + 2 / callfunc(12);

왜냐하면 callfunc 뭔가 유용한 일을 할 수도 있을 것 같아요.

표현식이 명령문이 되도록 허용한 후에는 표현식 내부에 대입 연산자(=)를 허용할 수도 있습니다.그렇기 때문에 C에서는 다음과 같은 작업을 수행할 수 있습니다.

callfunc(x = 2);

이는 표현식 x = 2(2의 값을 x에 할당)를 평가한 다음 해당 값(2)을 함수에 전달합니다. callfunc.

표현식과 명령문의 이러한 흐릿함은 모든 C 파생물(C, C++, C# 및 Java)에서 발생합니다. while) 그러나 거의 모든 표현식을 명령문으로 사용할 수 있습니다(C#에서는 할당, 호출, 증가 및 감소 표현식만 명령문으로 사용할 수 있습니다.보다 Scott Wisniewski의 답변).

두 개의 "구문 범주"(문과 표현의 종류에 대한 기술적인 이름)를 사용하면 노력이 중복될 수 있습니다.예를 들어 C에는 두 가지 형태의 조건문이 있습니다.

if (E) S1; else S2;

그리고 표현형

E ? E1 : E2

그리고 가끔 사람들은 원하다 존재하지 않는 중복:예를 들어, 표준 C에서는 진술만이 새로운 로컬 변수를 선언 할 수 있습니다. 그러나이 능력은 GNU C 컴파일러가 로컬 변수를 선언 할 수있는 GNU 확장자를 제공 할 정도로 유용합니다.

다른 언어의 디자이너들은 이런 종류의 중복을 좋아하지 않았으며, 표현식이 값뿐만 아니라 부작용도 가질 수 있다면, 구문론적 명령문과 표현식을 구별하는 것은 그다지 유용하지 않습니다. 그래서 그들은 이를 제거했습니다.Haskell, Icon, Lisp, ML은 모두 구문문이 없고 표현식만 있는 언어입니다.클래스 구조의 반복 및 조건 형식도 표현식으로 간주되며 값이 있지만 그다지 흥미롭지는 않습니다.

다른 팁

위의 Joel의 답변을 약간 수정하고 싶습니다.

C#에서는 모든 표현식을 명령문으로 사용할 수 없습니다.특히 할당, 호출, 증가, 감소 표현식만 명령문으로 사용할 수 있습니다.

예를 들어 C# 컴파일러는 다음 코드를 구문 오류로 플래그 지정합니다.

1 + 2;

  • 표현식은 값을 산출하는 모든 것입니다.2 + 2
  • 명령문은 프로그램 실행의 기본 "블록" 중 하나입니다.

C에서 "="는 실제로 두 가지 작업을 수행하는 연산자입니다.

  • 오른쪽 하위 표현식의 값을 반환합니다.
  • 오른쪽 하위 표현식의 값을 왼쪽 변수에 복사합니다.

다음은 ANSI C 문법에서 발췌한 내용입니다.C에는 다양한 종류의 명령문이 없다는 것을 알 수 있습니다.프로그램의 대부분의 명령문은 표현식 명령문입니다.끝에 세미콜론이 있는 표현입니다.

statement
    : labeled_statement
    | compound_statement
    | expression_statement
    | selection_statement
    | iteration_statement
    | jump_statement
    ;

expression_statement
    : ';'
    | expression ';'
    ;

http://www.lysator.liu.se/c/ANSI-C-grammar-y.html

표현식은 값을 반환하는 반면 문은 그렇지 않습니다.

예를 들어:

1 + 2 * 4 * foo.bar()     //Expression
foo.voidFunc(1);          //Statement

둘 사이의 큰 거래는 표현식을 함께 연결할 수 있는 반면 명령문은 연결할 수 없다는 것입니다.

당신은 이것을 찾을 수 있습니다 위키피디아, 이지만 표현식은 일부 값으로 평가되는 반면 명령문에는 평가된 값이 없습니다.

따라서 표현식은 명령문에서 사용될 수 있지만 그 반대의 경우는 사용할 수 없습니다.

일부 언어(예: Lisp, Ruby 및 기타 여러 언어)는 명령문과 표현식을 구별하지 않습니다.이러한 언어에서는 모든 것이 표현식이며 다른 표현식과 연결될 수 있습니다.

표현식과 명령문의 구성성(연쇄성)의 중요한 차이점을 설명하기 위해 제가 가장 좋아하는 참고 자료는 John Backus의 Turing 수상 논문입니다. 프로그래밍이 폰 노이만 스타일에서 해방될 수 있습니까?.

명령형 언어(Fortran, C, Java 등)는 프로그램 구조화를 위한 명령문을 강조하고 일종의 사후 고려 사항으로 표현을 갖습니다.기능적 언어는 표현을 강조합니다. 전혀 함수형 언어에는 명령문을 완전히 제거할 수 있을 만큼 강력한 표현이 있습니다.

간단히:표현식은 값으로 평가되지만 문은 그렇지 않습니다.

표현식은 값을 얻기 위해 평가될 수 있는 반면, 명령문은 값을 반환하지 않습니다. 무효의).

물론 함수 호출 표현식도 명령문으로 간주될 수 있지만 실행 환경에 반환된 값을 보유하는 특수 내장 변수가 없으면 이를 검색할 방법이 없습니다.

명령문 지향 언어에서는 모든 프로시저가 명령문 목록이어야 합니다.아마도 모든 기능적 언어인 표현식 지향 언어는 표현식 목록이거나 LISP의 경우 표현식 목록을 나타내는 하나의 긴 S-표현식입니다.

두 유형 모두 구성이 가능하지만 대부분의 표현식은 유형이 일치하는 한 임의로 구성할 수 있습니다.각 유형의 명령문에는 다른 명령문을 구성하는 고유한 방법이 있습니다.Foreach 및 if 문에는 하위 문이 자체 하위 문을 허용하지 않는 한 단일 문이 필요하거나 모든 하위 문이 차례로 문 블록에 들어가야 합니다.

명령문에는 표현식이 포함될 수도 있습니다. 여기서 표현식은 실제로 어떤 명령문도 포함하지 않습니다.그러나 한 가지 예외는 함수를 나타내는 람다 표현식이므로 언어가 Python의 단일 표현식 람다와 같이 제한된 람다만 허용하지 않는 한 함수가 포함할 수 있는 모든 것을 포함할 수 있습니다.

표현식 기반 언어에서는 모든 제어 구조가 값을 반환하므로(대부분 NIL을 반환함) 함수에 대한 단일 표현식만 있으면 됩니다.함수에서 마지막으로 평가된 표현식이 반환 값이므로 return 문이 필요하지 않습니다.

표현 기반 언어에 관한 몇 가지 사항:


가장 중요한:모든 것은 값을 반환합니다


모든 것이 표현식이기 때문에 코드 블록과 표현식을 구분하는 중괄호와 중괄호 사이에는 차이가 없습니다.하지만 이는 어휘 범위 지정을 방지하지 않습니다.예를 들어, 정의가 포함된 표현식과 그 안에 포함된 모든 명령문에 대해 지역 변수를 정의할 수 있습니다.


표현식 기반 언어에서는 모든 것이 값을 반환합니다.처음에는 다소 이상할 수 있습니다. (FOR i = 1 TO 10 DO (print i)) 반품?

몇 가지 간단한 예:

  • (1) 보고 1
  • (1 + 1) 보고 2
  • (1 == 1) 보고 TRUE
  • (1 == 2) 보고 FALSE
  • (IF 1 == 1 THEN 10 ELSE 5) 보고 10
  • (IF 1 == 2 THEN 10 ELSE 5) 보고 5

몇 가지 더 복잡한 예:

  • 일부 함수 호출과 같은 일부 항목에는 실제로 반환할 의미 있는 값이 없습니다(부작용만 발생하는 항목?).부름 OpenADoor(), FlushTheToilet() 또는 TwiddleYourThumbs() OK, Done 또는 Success와 같은 일종의 평범한 값을 반환합니다.
  • 하나의 큰 표현식 내에서 연결되지 않은 여러 표현식이 평가되는 경우 대형 표현식에서 마지막으로 평가된 값이 대형 표현식의 값이 됩니다.예를 들자면 (FOR i = 1 TO 10 DO (print i)), for 루프의 값이 "10"이면 다음이 발생합니다. (print i) 표현식은 10번 평가될 때마다 i를 문자열로 반환합니다.반품을 통한 마지막 시간 10, 최종 답변

표현식 기반 언어를 최대한 활용하려면 사고방식을 약간 바꿔야 하는 경우가 많습니다. 모든 것이 표현식이라는 사실로 인해 많은 항목을 '인라인'할 수 있기 때문입니다.

간단한 예를 들면 다음과 같습니다.

 FOR i = 1 to (IF MyString == "Hello, World!" THEN 10 ELSE 5) DO
 (
    LotsOfCode
 )

비 표현식 기반에 대한 완벽하게 유효한 대체입니다.

IF MyString == "Hello, World!" THEN TempVar = 10 ELSE TempVar = 5 
FOR i = 1 TO TempVar DO
(    
    LotsOfCode  
)

어떤 경우에는 표현식 기반 코드가 허용하는 레이아웃이 훨씬 더 자연스럽게 느껴집니다.

물론 이것은 광기로 이어질 수 있습니다.MaxScript라는 표현식 기반 스크립팅 언어를 사용한 취미 프로젝트의 일환으로 저는 이 괴물 같은 라인을 생각해냈습니다.

IF FindSectionStart "rigidifiers" != 0 THEN FOR i = 1 TO (local rigidifier_array = (FOR i = (local NodeStart = FindsectionStart "rigidifiers" + 1) TO (FindSectionEnd(NodeStart) - 1) collect full_array[i])).count DO
(
    LotsOfCode
)

명령문은 표현식의 특별한 경우입니다. void 유형.명령문을 다르게 취급하는 언어의 경향은 문제를 일으키는 경우가 많으며 적절하게 일반화되면 더 좋을 것입니다.

예를 들어, C#에는 매우 유용한 Func<T1, T2, T3, TResult> 오버로드된 일반 대리자 세트.하지만 우리는 또한 상응하는 것이 있어야 합니다 Action<T1, T2, T3> 이 불행한 분기점을 처리하려면 범용 고차 프로그래밍을 지속적으로 복제해야 합니다.

간단한 예 - 다른 함수를 호출하기 전에 참조가 null인지 확인하는 함수:

TResult IfNotNull<TValue, TResult>(TValue value, Func<TValue, TResult> func)
                  where TValue : class
{
    return (value == null) ? default(TValue) : func(value);
}

컴파일러가 다음의 가능성을 처리할 수 있습니까? TResult 존재 void?예.해야 할 일은 return 다음에 다음 유형의 표현식이 와야 한다는 것입니다. void.결과 default(void) 유형일 것이다 void, 전달되는 함수는 다음 형식이어야 합니다. Func<TValue, void> (이것은 다음과 같습니다. Action<TValue>).

다른 많은 대답은 표현식을 사용하여 문을 연결할 수 없다는 것을 암시하지만 이 아이디어가 어디서 나온 것인지 잘 모르겠습니다.우리는 다음을 생각할 수 있습니다. ; 이항 중위 연산자로 명령문 뒤에 표시되며 유형의 두 표현식을 사용합니다. void 그리고 이를 하나의 유형 표현식으로 결합합니다. void.

진술 -> 순차적으로 따라야 할 지침
표현식 -> 값을 반환하는 평가

명령문은 기본적으로 알고리즘의 단계 또는 명령과 유사하며 명령문 실행의 결과는 명령 포인터(소위 어셈블러에서)의 실현입니다.

표현식은 언뜻 보기에 실행 순서를 암시하지 않으며, 그 목적은 값을 평가하고 반환하는 것입니다.명령형 프로그래밍 언어에서 표현식의 평가에는 순서가 있지만 이는 명령형 모델 때문일 뿐 본질은 아닙니다.

진술의 예:

for
goto
return
if

(모두 실행 라인(문)이 다른 라인으로 진행됨을 의미합니다.)

표현식의 예:

2+2

(실행이라는 개념이 아니라 평가라는 개념을 의미합니다)

진술은 문법적으로 완전한 문장입니다.표현은 그렇지 않습니다.예를 들어

x = 5

"x gets 5"로 읽습니다. 이것은 완전한 문장입니다.코드

(x + 5)/9.0

"X Plus 5는 모두 9.0으로 나뉩니다." 이것은 완전한 문장이 아닙니다.성명서

while k < 10: 
    print k
    k += 1

완전한 문장이다.루프 헤더는 그렇지 않습니다."k < 10인 동안"은 종속절입니다.

성명,

문은 모든 C# 프로그램이 구성되는 절차적 구성 요소입니다.문은 지역 변수나 상수를 선언하거나, 메서드를 호출하거나, 개체를 만들거나, 변수, 속성 또는 필드에 값을 할당할 수 있습니다.

중괄호로 묶인 일련의 명령문은 코드 블록을 형성합니다.메서드 본문은 코드 블록의 한 예입니다.

bool IsPositive(int number)
{
    if (number > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

C#의 문에는 표현식이 포함되는 경우가 많습니다.C#의 식은 리터럴 값, 간단한 이름 또는 연산자와 해당 피연산자를 포함하는 코드 조각입니다.

표현,

표현식은 단일 값, 개체, 메서드 또는 네임스페이스로 평가될 수 있는 코드 조각입니다.가장 간단한 두 가지 유형의 표현식은 리터럴과 단순 이름입니다.리터럴은 이름이 없는 상수 값입니다.

int i = 5;
string s = "Hello World";

i와 s는 모두 지역 변수를 식별하는 간단한 이름입니다.해당 변수가 표현식에 사용되면 변수 값이 검색되어 표현식에 사용됩니다.

나는 다음의 의미를 더 선호한다. statement 단어의 형식적 논리 의미에서.이는 계산에서 하나 이상의 변수 상태를 변경하여 해당 값에 대해 참 또는 거짓 진술이 이루어질 수 있도록 하는 것입니다.

새로운 용어나 단어가 도입되거나, 기존 단어가 '용도 변경'되거나, 사용자가 자신이 설명하는 내용에 대해 기존, 확립된 또는 '적절한' 용어에 대해 무지할 때 컴퓨팅 세계와 과학 전반에는 항상 혼란이 있을 것이라고 생각합니다.

나는 여기에 대한 답변에 정말로 만족하지 않습니다.문법을 살펴봤는데 C++(ISO 2008).그러나 아마도 교훈과 프로그래밍을 위해 두 요소를 구별하는 데 답변이 충분할 수 있습니다(현실은 더 복잡해 보입니다).

명령문은 0개 이상의 표현식으로 구성되지만 다른 언어 개념일 수도 있습니다.다음은 문법에 대한 Extended Backus Naur 형식입니다(문에서 발췌).

statement:
        labeled-statement
        expression-statement <-- can be zero or more expressions
        compound-statement
        selection-statement
        iteration-statement
        jump-statement
        declaration-statement
        try-block

C++에서 명령문으로 간주되는 다른 개념도 볼 수 있습니다.

  • 표현문s는 자체적으로 설명됩니다(문은 0 또는 표현, 문법을 잘 읽어보세요, 까다롭습니다)
  • case 예를 들어 레이블이 붙은 진술
  • 선택문if if/else, case
  • 반복문while, do...while, for (...)
  • 점프문break, continue, return (표현식을 반환할 수 있음), goto
  • 선언문 선언 세트입니다
  • 시도 블록 나타내는 진술이다 try/catch 블록
  • 그리고 문법에 좀 더 내용이 있을 수도 있어요

이것은 표현식 부분을 보여주는 발췌입니다.

expression:
        assignment-expression
        expression "," assignment-expression
assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator initializer-clause
        throw-expression
  • 표현식은 종종 할당이거나 포함됩니다
  • 조건식 (오해의 소지가 있는 것처럼 들림)은 연산자(+, -, *, /, &, |, &&, ||, ...)
  • 던지기 표현 - 음?그만큼 throw 절도 표현식이다

내가 찾은 가장 간단한 답변 중 하나가 여기에 있습니다.

원래 Anders Kaseorg가 답변했습니다.

명령문은 특정 작업을 수행하는 완전한 코드 줄인 반면, 표현식은 값으로 평가되는 코드 섹션입니다.

표현식은 연산자를 사용하여 "수평으로" 더 큰 표현식으로 결합할 수 있는 반면, 명령문은 하나씩 쓰거나 블록 구성을 사용하여 "수직으로"만 결합할 수 있습니다.

모든 표현식은 문(그 효과는 표현식을 평가하고 결과 값을 무시하는 것임)으로 사용할 수 있지만 대부분의 문은 표현식으로 사용할 수 없습니다.

http://www.quora.com/Python-programming-언어-1/Whats-the-difference-between-a-statement-and-an-expression-in-Python

이전 답변을 개선하고 검증하려면 해당되는 경우 프로그래밍 언어 용어의 정의를 컴퓨터 과학 유형 이론에서 설명해야 합니다.

표현식에 Bottom 유형이 아닌 유형이 있습니다.그것은 가치가 있습니다.명령문에는 Unit 또는 Bottom 유형이 있습니다.

따라서 명령문은 값을 반환할 수 없거나 할당할 수 없는 Unit 유형의 값만 반환하기 때문에(일부 언어에서는) 부작용이 발생할 때만 프로그램에 영향을 미칠 수 있습니다. C's void) 또는 (예: Scala에서) 명령문의 지연된 평가를 위해 저장할 수 있습니다.

분명히 @pragma 또는 /*comment*/ 유형이 없으므로 명령문과 구별됩니다.따라서 부작용이 없는 유일한 유형의 명령문은 비작동입니다.비작동은 향후 부작용에 대한 자리 표시자로만 유용합니다.진술로 인한 다른 조치는 부작용이 될 수 있습니다.다시 컴파일러 힌트입니다. @pragma, 유형이 없으므로 명령문이 아닙니다.

가장 정확하게는 진술에는 다음이 있어야 합니다. "부작용" (즉. 필수적이다) 및 표현식은 다음과 같아야 합니다. 가지다 유형(예:하단 유형이 아님).

그만큼 진술의 종류 은 단위 유형이지만 Halting 정리로 인해 단위는 허구이므로 바닥 유형.


Void 정확하게는 하위 유형이 아닙니다(가능한 모든 유형의 하위 유형이 아닙니다).그것은 다음과 같은 언어로 존재합니다. 완전한 사운드 유형 시스템이 없습니다..속물같은 말처럼 들릴지 모르지만, 완전함 분산 주석과 같은 확장 가능한 소프트웨어를 작성하는 데 중요합니다.

이 문제에 대해 Wikipedia가 무엇을 말하는지 살펴보겠습니다.

https://en.wikipedia.org/wiki/Statement_(컴퓨터_과학)

컴퓨터 프로그래밍에서 명령문은 명령문의 가장 작은 독립형 요소입니다. 피할 수 없는 표현하는 프로그래밍 언어 어떤 행동 수행됩니다.

다양한 언어(예:C) 실행 가능한 코드만 포함하는 명령문과 식별자를 선언하는 정의를 사용하여 명령문과 정의를 구별하는 반면, 표현식은 값만 평가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top