리눅스 / 유닉스 명령 : expr

이름

expr - 표현식 평가

개요

expr arg ? arg arg ... ?

arg를 연결하여 (그 사이에 분리 기호 공백을 추가) 결과를 Tcl 표현식으로 평가하고 값을 반환합니다. Tcl 표현식에서 허용되는 연산자는 C 표현식에서 허용되는 연산자의 하위 집합이며 해당 C 연산자와 동일한 의미와 우선 순위를 갖습니다. 표현식은 거의 항상 숫자 결과 (정수 또는 부동 소수점 값)를 산출 합니다. 예를 들어, 표현식

expr 8.2 + 6

14.2로 평가됩니다. Tcl 표현식은 피연산자가 지정된 방식으로 C 표현식과 다릅니다. 또한 Tcl 표현식은 숫자가 아닌 피연산자와 문자열 비교를 지원합니다.

피연산자

Tcl 표현식은 피연산자, 연산자 및 괄호의 조합으로 구성됩니다. 공백은 피연산자와 연산자 및 괄호 사이에 사용될 수 있습니다. 표현식의 지시에 의해 무시됩니다. 가능한 경우 피연산자는 정수 값으로 해석됩니다. 정수 값은 10 진수 (일반 경우), 8 진수 (피연산자의 첫 번째 문자가 0 인 경우 ) 또는 16 진수 (피연산자의 처음 두 문자가 0x 인 경우 )로 지정 될 수 있습니다. 피연산자가 위에 주어진 정수 형식 중 하나를 가지지 않으면 가능한 경우 부동 소수점 숫자로 처리됩니다. 부동 소수점 숫자는 ANSI 호환 C 컴파일러에서 허용하는 방식으로 지정할 수 있습니다 (대부분의 설치에서 f , F , lL 접미어가 허용되지 않음). 예를 들어, 다음은 모두 유효한 부동 소수점 숫자입니다 : 2.1, 3., 6e4, 7.91e + 16. 숫자 해석이 가능하지 않으면 피연산자는 문자열로 남게됩니다 (그리고 한정된 연산자 집합 만 적용될 수 있습니다).

피연산자는 다음과 같은 방법으로 지정할 수 있습니다.

[1]

정수 값 또는 부동 소수점 숫자 값입니다.

[2]

표준 $ 표기법을 사용하는 Tcl 변수입니다. 변수의 값이 피연산자로 사용됩니다.

[삼]

큰 따옴표로 묶은 문자열입니다. 표현 파서는 따옴표 사이의 정보에 백 슬래시, 변수 및 명령 대체를 수행하고 결과 값을 피연산자로 사용합니다

[4]

중괄호로 묶인 문자열입니다. 열린 중괄호와 일치하는 닫는 중괄호 사이의 문자는 대체없이 피연산자로 사용됩니다.

[5]

대괄호로 묶인 Tcl 명령입니다. 명령이 실행되고 결과가 피연산자로 사용됩니다.

[6]

인수에 sin ($ x) 과 같은 피연산자에 대해 위 양식 중 하나가있는 수학 함수입니다. 정의 된 기능 목록은 아래를 참조하십시오.

위의 경우 (예 : 따옴표로 묶은 문자열) 대체가 발생하면 식의 지시에 따라 수행됩니다. 그러나 표현 프로세서가 호출되기 전에 명령 파서가 추가 대체 레이어를 이미 수행했을 수 있습니다. 아래에서 설명하는 것처럼 대개 명령 중괄호가 내용을 대체하지 못하도록 대괄호로 표현식을 묶는 것이 가장 좋습니다.

간단한 표현식의 몇 가지 예를 들어, 변수 a 는 값 3을 가지며 변수 b 는 값 6을가집니다. 그러면 아래의 각 행의 왼쪽에있는 명령은 행의 오른쪽에 값을 생성합니다.

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b"5.6 expr 4 * [llength "6 2"] 8 expr {{word one} < "word $ a"} 0

연산자

유효한 연산자가 아래에 나열되어 있으며 우선 순위가 내림차순으로 그룹화되어 있습니다.

- + ~!

단항 마이너스, 단항 더하기, 비트 단위 NOT, 논리적 NOT. 이 피연산자 중 어느 것도 문자열 피연산자에 적용될 수 없으며 비트 단위 NOT은 정수에만 적용될 수 있습니다.

* / %

곱하기, 나누기, 나머지. 이 피연산자 중 어느 것도 문자열 피연산자에 적용될 수 없으며 나머지는 정수에만 적용될 수 있습니다. 나머지는 항상 제수와 동일한 부호를 가지며 절대 값은 제수보다 작습니다.

+ -

더하거나 뺍니다. 모든 숫자 피연산자에 유효합니다.

<< >>

왼쪽과 오른쪽 교대. 정수 피연산자에만 유효합니다. 오른쪽 시프트는 항상 부호 비트를 전달합니다.

<> <=> =

부울 적음, 작음, 작거나 같음, 크거나 같음. 각 연산자는 조건이 참이면 1을, 그렇지 않으면 0을 생성합니다. 이 연산자는 문자열뿐만 아니라 숫자 피연산자에도 적용될 수 있습니다.이 경우 문자열 비교가 사용됩니다.

==! =

부울은 같고 같지 않습니다. 각 연산자는 0 / 1 개의 결과를 생성합니다. 모든 피연산자 유형에 유효합니다.

&

비트 단위 AND. 정수 피연산자에만 유효합니다.

^

비트 단위의 배타적 논리합. 정수 피연산자에만 유효합니다.

|

비트 단위 OR. 정수 피연산자에만 유효합니다.

&&

논리적 AND. 두 피연산자가 0이 아니면 1 결과를, 그렇지 않으면 0을 생성합니다. 부울 및 숫자 (정수 또는 부동 소수점) 피연산자에만 유효합니다.

||

논리적 OR. 두 피연산자가 모두 0이면 결과가 0이고 그렇지 않으면 1입니다. 부울 및 숫자 (정수 또는 부동 소수점) 피연산자에만 유효합니다.

x ? y : z

If-then-else, C와 같습니다. x 가 0이 아닌 것으로 평가되면 결과는 y 의 값입니다. 그렇지 않으면 결과는 z 값이됩니다. x 피연산자는 숫자 값을 가져야합니다.

각 연산자가 생성 한 결과에 대한 자세한 내용은 C 매뉴얼을 참조하십시오. 모든 이진 연산자는 왼쪽에서 오른쪽으로 동일한 우선 순위 수준으로 그룹화됩니다. 예를 들어, 명령

expr 4 * 2 <7

0을 반환합니다.

&& , || , ? : 연산자는 결과를 결정할 필요가 없다면 피연산자가 평가되지 않는다는 것을 의미하는 C와 마찬가지로``lazy evaluation ''을 갖는다. 예를 들어, 명령에서

expr {$ v? [a] : [b]}

$ v 의 값에 따라 [a ] 또는 [b] 중 하나만 실제로 평가됩니다. 그러나 전체 표현식이 중괄호로 묶인 경우에만 해당됩니다. 그렇지 않으면 Tcl 파서는 expr 명령을 호출하기 전에 [a][b] 를 모두 평가합니다.

수학 함수

Tcl은 표현식에서 다음과 같은 수학 함수를 지원합니다.

abs cosh 로그 sqrt acos 더블 log10 srand asin exp pow tan atan 플로어 랜드 tanh atan2 fmod 라운드 ceil hypot sin cos int sinh

abs ( arg )

arg 의 절대 값을 리턴합니다. Arg 는 정수 또는 부동 소수점 중 하나 일 수 있으며 결과는 동일한 형식으로 반환됩니다.

아 코스 ( arg )

[0, pi] 라디안 범위의 arg 의 아크 코사인을 반환합니다. Arg 는 [-1,1] 범위 내에 있어야합니다.

아신 ( arg )

[-pi / 2, pi / 2] 라디안 범위의 arg 의 아크 사인을 반환합니다. Arg 는 [-1,1] 범위 내에 있어야합니다.

atan ( arg )

[-pi / 2, pi / 2] 범위의 arg 의 역 탄젠트를 반환합니다.

atan2 ( x, y )

[-pi, pi] 라디안 범위의 y / x 의 역 탄젠트를 반환합니다. xy 는 모두 0 일 수는 없습니다.

천장 ( arg )

arg 보다 작지 않은 가장 작은 정수 값을 구합니다.

cos ( arg )

라디안 단위로 측정 된 arg 의 코사인을 반환합니다.

코 쉬 ( arg )

arg 의 쌍곡선 코사인을 반환합니다. 결과로 오버플로가 발생하면 오류가 반환됩니다.

이중 ( arg )

arg 가 부동 값이면 arg를 반환하고 그렇지 않으면 arg 를 부동 값으로 변환하고 변환 된 값을 반환합니다.

exp ( arg )

e ** arg 로 정의 된 arg 의 지수를 반환합니다. 결과로 오버플로가 발생하면 오류가 반환됩니다.

층 ( arg )

arg 보다 크지 않은 가장 큰 정수 값을 구합니다.

fmod ( x, y )

x 의 나눗셈에서 부동 소수점 나머지를 y로 반환합니다. y 가 0이면 오류가 리턴됩니다.

hypot ( x, y )

직각 삼각형 ( x * x + y * y )의 빗변 길이를 계산합니다.

int ( arg )

arg 가 정수 값이면 arg를 반환하고, 그렇지 않으면 truncation에 의해 arg 를 정수로 변환하고 변환 된 값을 반환합니다.

로그 ( arg )

arg 의 자연 로그를 돌려줍니다. Arg 는 양수 여야합니다.

log10 ( arg )

arg 의 기본 10 로그를 반환합니다. Arg 는 양수 여야합니다.

pow ( x, y )

x 의 값을 y로 승격합니다. x 가 음수이면 y 는 정수 값이어야합니다.

랜드()

부동 소수점 수를 0에서 1보다 작거나 수학적으로 범위 [0,1]에서 반환합니다. 시드는 기계의 내부 클럭에서 유래하거나 매뉴얼 기능으로 설정할 수 있습니다.

라운드 ( arg )

arg 가 정수 값이면 arg를 반환하고 그렇지 않으면 arg 를 반올림하여 정수로 변환하고 변환 된 값을 반환합니다.

죄 ( arg )

라디안 단위로 측정 된 arg 의 사인을 반환합니다.

sinh ( arg )

arg 의 쌍곡선 사인을 돌려줍니다. 결과로 오버플로가 발생하면 오류가 반환됩니다.

sqrt ( arg )

arg의 제곱근을 반환합니다. Arg 는 음수가 아니어야합니다.

srand ( arg )

정수 여야하는 arg 는 난수 생성 프로그램의 시드를 다시 설정하는 데 사용됩니다. 그 seed로부터 최초의 난수를 돌려줍니다. 각 통역사마다 고유 한 시드가 있습니다.

탄 ( arg )

라디안 단위로 측정 된 arg 의 탄젠트를 반환합니다.

탄 ( arg )

arg 의 쌍곡선 탄젠트를 반환합니다.

이러한 미리 정의 된 함수 외에도 응용 프로그램은 Tcl_CreateMathFunc ()를 사용하여 추가 함수를 정의 할 수 있습니다.

유형, 오버플로 및 정밀도

정수가 포함 된 모든 내부 계산은 C 유형 long 으로 수행되며 부동 소수점을 포함하는 모든 내부 계산은 C 유형 double 로 수행됩니다. 문자열을 부동 소수점으로 변환 할 때 지수 오버플로가 감지되어 Tcl 오류가 발생합니다. 문자열에서 정수로 변환하는 경우 오버플로 감지는 로컬 C 라이브러리의 일부 루틴 동작에 따라 달라 지므로 신뢰할 수없는 것으로 간주해야합니다. 어쨌든 정수 오버플로 및 언더 플로는 일반적으로 중간 결과에 대해 안정적으로 감지되지 않습니다. 부동 소수점 오버 플로우 및 언더 플로우는 일반적으로 꽤 안정적인 하드웨어가 지원하는 수준까지 감지됩니다.

정수, 부동 소수점 및 문자열 피연산자에 대한 내부 표현 간의 변환은 필요에 따라 자동으로 수행됩니다. 산술 연산의 경우, 부동 소수점 숫자가 도입 될 때까지 정수가 사용되며 그 후에 부동 소수점이 사용됩니다. 예를 들어,

expr 5 / 4

1을 반환하며

expr 5 / 4.0 expr 5 / ([문자열 길이 "abcd"] + 0.0)

둘 다 1.25를 반환합니다. 부동 소수점 값은 항상`` . ''또는 e를 사용 하여 정수 값처럼 보일 수 없습니다. 예를 들어,

expr 20.0 / 5.0

4가 아니라 4.0을 반환합니다.

문자열 연산

표현식 평가 기는 가능한 경우 정수 또는 부동 소수점으로 비교를 시도하지만 비교 연산자의 피연산자로 문자열 값을 사용할 수 있습니다. 비교 연산자의 피연산자 중 하나가 문자열이고 다른 하나가 숫자 값을 갖는 경우 숫자 피연산자는 정수의 경우 C sprintf 형식 지정자 % d 및 부동 소수점 값의 경우 % g 을 사용하여 문자열로 다시 변환됩니다. 예를 들어, 명령

expr { "0x03"> "2"} expr { "0y"< "0x12"}

둘 다 1을 반환합니다. 첫 번째 비교는 정수 비교를 사용하여 수행되고 두 번째 비교는 두 번째 피연산자가 문자열 18 로 변환 된 후 문자열 비교를 사용하여 수행됩니다. 가능할 때마다 값을 숫자로 취급하는 Tcl의 경향 때문에 일반적으로 문자열 비교를 원할 때 == 와 같은 연산자를 사용하는 것은 좋지 않으며 피연산자의 값은 임의적 일 수 있습니다. 이 경우 문자열 명령을 대신 사용하는 것이 좋습니다.

성능 고려 사항

최상의 속도와 최소 저장 요구 사항을 위해 표현식을 중괄호로 묶습니다. 이를 통해 Tcl 바이트 코드 컴파일러가 최상의 코드를 생성 할 수 있습니다.

위에서 언급했듯이, 표현식은 Tcl 파서에 한 번, expr 명령에 의해 한 번씩 두 번 대체됩니다. 예를 들어, 명령

3 세트를 설정하십시오. b {$ a + 2} expr $ b * 4

이것은 Tcl 파서가 변수 b에 대해 $ a + 2 를 먼저 대체하기 때문에 expr 명령은 $ a + 2 * 4 표현식을 평가할 것이기 때문입니다.

대부분의 표현식은 두 번째 대체가 필요하지 않습니다. 중괄호로 묶여 있거나, 그렇지 않은 경우 변수 및 명령 대체는 숫자 또는 문자열 자체가 대체가 필요하지 않습니다. 그러나, 몇 가지 칭찬을받지 않는 표현식은 두 번의 대체가 필요하기 때문에 바이트 코드 컴파일러는이 상황을 처리하기 위해 추가 지침을 내 보내야합니다. 가장 비용이 많이 드는 코드는 명령 대체가 포함 된 표현식이없는 표현식에 필요합니다. 이 표현식은 표현식이 실행될 때마다 새 코드를 생성하여 구현해야합니다.

키워드

산술, 부울 , 비교, 표현, 퍼지 비교

중요 : man 명령 ( % man )을 사용하여 특정 컴퓨터에서 명령이 어떻게 사용되는지보십시오.