연산자 (프로그래밍): 두 판 사이의 차이

위키백과, 우리 모두의 백과사전.
내용 삭제됨 내용 추가됨
17번째 줄: 17번째 줄:


== 피연산자 강제 변환 ==
== 피연산자 강제 변환 ==
{{참고|타입 변환}}
{{참고|형변환}}
Some languages also allow for the operands of an operator to be implicitly converted, or [[Type_conversion#Implicit_type_conversion|''coerced'']], to suitable data types for the operation to occur. For example, in [[Perl]] coercion rules lead into <code>12 + "3.14"</code> producing the result of <code>15.14</code>. The text <code>"3.14"</code> is converted to the number 3.14 before addition can take place. Further, <code>12</code> is an integer and <code>3.14</code> is either a floating or fixed-point number (a number that has a decimal place in it) so the integer is then converted to a floating point or fixed-point number respectively.
몇몇 언어도 암시적으로 변환할 있는 연산자의 피연산자, 혹은 [[형변환#암시적 형변환|''강제'']] 발생하는 연산을 위한 적합한 자료형을 허용한다. 예를 들어, [[]]에서 강제적인 규칙 <code>12 + "3.14"</code> 리드한 <code>15.14</code>의 결과를 산출한다. 문자열 <code>"3.14"</code> 덧셈이 대신 숫자 3.14로 변환된다. 추가로, <code>12</code> 정수이고 <code>3.14</code> 부동 또는 고정 소수점 숫자 하나이다 (그것에 소수점 자리를 가진 숫자) 그래서 정수는 다음에 각각 부동 소수점 또는 고정 소수점 숫자로 변환된다.


[[Javascript]] follows opposite rules—finding the same expression above, it will convert the integer <code>12</code> into a string <code>"12"</code>, then concatenate the two operands to form <code>"123.14"</code>.
[[자바스크립트]] 반대 규칙을 따른다—위와 같은 표현을 찾는다면, 문자열<code>"12"</code> 정수 <code>12</code>로 변환한다면, <code>"123.14"</code> 형태에 두 피연산자를 연결한다.


언어에 의한 지배들의 존재에서, 프로그래머는 미묘한 프로그래밍 오류를 피하기 위해 피연산자 유형 및 작업 결과 유형에 대한 특정 규칙을 인식하고 있어야한다.
In the presence of coercions in a language, the programmer must be aware of the specific rules regarding operand types and the operation result type to avoid subtle programming mistakes.


== Operator features in programming languages ==
== Operator features in programming languages ==

2011년 9월 30일 (금) 17:46 판

프로그래밍 언어는 일반적으로 수학 연산과 유사한 연산자의 집합을 지원한다. 언어는 내장된 연산자의 정해진 숫자를 포함할 수 있다 (C와 C++에서 + - * = 연산자의 경우), 아니면 프로그래머가 정의한 연산자의 생성을 허용할 수 있다 (하스켈의 경우). 일부 프로그래밍 언어는 다른 div와 같은 이름도 허용하는 동안 특수 문자 + 또는 := 과 같은 연산자 기호를 제한한다 (파스칼의 경우).

언어에 의해 지원된 내장 연산자 일부는 일반적으로 중앙 처리 장치에 있는 명령의 작은 숫자에 직접 매핑을 하지만, 다른 것은 복잡한 구현을 할 수도 있다 (예를 들어, '+'는 문자열 연결을 표현하기 위해 사용한다).

언어의 사양은 우선순위와 그것이 지원하는 연산자의 결합법칙을 지정한다. 프로그래머가 정의된 연산자를 지원하는 언어는 새로운 연산자의 기호 (예: 프롤로그)의 우선순위와 결합법칙의 사양이 필요하다.

대부분의 프로그래밍 언어 연산자는 몇몇 많은 피연산자 (예, C에서 ?: 연산자) 지원과 함께, 하나 또는 두 개의 피연산자를 사용한다. 그것의 피연산자와 관련하여 연산자의 위치는 전위 표기법, 중위 표기법 또는 후위 표기법일 것이다.

구문 연산자는 보통 함수와 대조를 이룬다. 대부분의 언어는, 함수는 아마도 고정된 우선순위 수준과 결합법칙에 대한 전위 연산자의 특별한 형태, 괄호에 대해서 강제적일 것이다. 예: Func(a) (혹은 리스프에서 (Func a)). 대부분의 언어는 프로그래머가 정의한 기능을 지원하지만, 그들은 더 많은 전위 표기법과 더 많은 우선순위 수준이 없으면 프로그래머가 정의 연산자를 지원하도록 실제로 주장할 수 없다. 의미적으로 연산자는 다른 호출 표기법 및 매개 변수의 제한된 숫자 (보통 1 혹은 2개)에 대한 함수의 특별한 형태로 볼 수 있다.

컴파일러는 서브루틴 호출이나 인라인 코드와 함께 연산자 및 함수 기능을 구현할 수 있다.

연산자 오버로딩

몇몇의 프로그래밍 언어에서 연산자는 아마도 자료의 한 종류보다 많은 정의를 가지고 있는 애드혹 다형성일 것이다, (자바에서 같은 + 연산자는 숫자의 덧셈과 문자열의 연결 모두에 사용된다). 이러한 연산자는 오버로드된 것으로 전해지고 있다. 프로그래밍 언어에서 프로그래머가 연산자의 제한된 집합을 가진 연산자 오버로딩을 지원하지만, 연산자 오버로딩은 종종 연산자에 맞게 정의하는 데 사용한다.

피연산자 강제 변환

몇몇 언어도 암시적으로 변환할 수 있는 연산자의 피연산자, 혹은 강제로 발생하는 연산을 위한 적합한 자료형을 허용한다. 예를 들어, 에서 강제적인 규칙 12 + "3.14"에 리드한 15.14의 결과를 산출한다. 문자열 "3.14"는 덧셈이 대신 숫자 3.14로 변환된다. 추가로, 12는 정수이고 3.14는 부동 또는 고정 소수점 숫자 중 하나이다 (그것에 소수점 자리를 가진 숫자) 그래서 정수는 그 다음에 각각 부동 소수점 또는 고정 소수점 숫자로 변환된다.

자바스크립트는 반대 규칙을 따른다—위와 같은 표현을 찾는다면, 문자열"12"는 정수 12로 변환한다면, "123.14" 형태에 두 피연산자를 연결한다.

언어에 의한 지배들의 존재에서, 프로그래머는 미묘한 프로그래밍 오류를 피하기 위해 피연산자 유형 및 작업 결과 유형에 대한 특정 규칙을 인식하고 있어야한다.

Operator features in programming languages

The following table shows the operator features in several programming languages:

Programming language Nonalphanumeric operator symbols Alphanumeric operator symbols Prefix Infix Postfix Precedence Associativity Overloading Programmer-defined overloading Programmer-defined operator symbols
ALGOL 68 +* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:

(All operators have bold Alphanumeric equivalents, c.f. next column. Some have non ASCII equivalents, c.f. below.) ¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠:

not abs arg bin entier leng level odd repr round shorten i shl shr up down lwb upb lt le ge gt eq ne and or over mod elem minusab plusab timesab divab overab modab plusto is isnt 아니요 (prefix operators always have priority 10) Infix operators are left associative, prefix operators are right associative
C () [] -> . ! ~ ++ -- + - * & / % << >> < <= > <= == != ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= sizeof 아니요 아니요
C++ (more) sizeof new delete throw 아니요
Java new instanceof 아니요 아니요
Pascal * / + - = < > <> <= >= := not div mod and or in 아니요 아니요 아니요
Seed7 {} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:= conv varConv parse conj div rem mdiv mod times mult in not and or digits lpad rpad lpad0
Prolog :- ?- ; , . =.. = \= < =< >= > == \== - + / * spy nospy not is mod 아니요 아니요
Lisp + - * / = /= < <= > >= mod rem floor truncate min max (operator and parameters must be surrounded by parentheses) 아니요 아니요 아니요 아니요 아니요
Smalltalk (yes - Up to two characters[1]) (yes - Needs a colon after the keyword) 아니요 아니요 아니요

See also

References