이름
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 컴파일러에서 허용하는 방식으로 지정할 수 있습니다 (단,에프, 에프, 엘, 및엘 대부분의 설치에서는 접미사를 사용할 수 없습니다). 예를 들어, 다음은 모두 유효한 부동 소수점 숫자입니다 : 2.1, 3., 6e4, 7.91e + 16. 숫자 해석이 가능하지 않으면 피연산자는 문자열로 남게됩니다 (그리고 한정된 연산자 집합 만 적용될 수 있습니다).
피연산자는 다음과 같은 방법으로 지정할 수 있습니다.
1
정수 값 또는 부동 소수점 숫자 값입니다.
2
표준을 사용하는 Tcl 변수로서$ 표기법. 변수의 값이 피연산자로 사용됩니다.
3
큰 따옴표로 묶은 문자열입니다. 표현 파서는 따옴표 사이의 정보에 백 슬래시, 변수 및 명령 대체를 수행하고 결과 값을 피연산자로 사용합니다
4
중괄호로 묶인 문자열입니다. 열린 중괄호와 일치하는 닫는 중괄호 사이의 문자는 대체없이 피연산자로 사용됩니다.
5
대괄호로 묶인 Tcl 명령입니다. 명령이 실행되고 결과가 피연산자로 사용됩니다.
6
인수에 피연산자에 대해 위 양식 중 하나가있는 수학 함수로서죄 ($ x). 정의 된 기능 목록은 아래를 참조하십시오.
위에서 치환이 발생하는 경우 (예 : 따옴표로 묶은 문자열) 표현식의 지시에 따라 수행됩니다. 그러나 표현 프로세서가 호출되기 전에 명령 파서가 추가 대체 레이어를 이미 수행했을 수 있습니다. 아래에서 설명하는 것처럼 대개 명령 중괄호가 내용을 대체하지 못하도록 대괄호로 표현식을 묶는 것이 가장 좋습니다.
간단한 표현의 몇 가지 예를 들어, 변수에이 값은 3이고 변수는비값 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입니다. 부울 및 숫자 (정수 또는 부동 소수점) 피연산자에만 유효합니다.
엑스 ? 와이 : 지
If-then-else, C에서와 같이. If 엑스 0이 아닌 것으로 평가하면 결과는 다음과 같습니다. 와이 . 그렇지 않으면 결과는의 값입니다. 지 . 그만큼 엑스 피연산자는 숫자 값을 가져야합니다.
각 연산자가 생성 한 결과에 대한 자세한 내용은 C 매뉴얼을 참조하십시오. 모든 이진 연산자는 왼쪽에서 오른쪽으로 동일한 우선 순위 수준으로 그룹화됩니다. 예를 들어, 명령
expr 4 * 2 <7
0을 반환합니다.
그만큼&&, ||, 및?: 연산자는 결과를 결정할 필요가 없다면 피연산자가 평가되지 않는다는 것을 의미하는 C와 마찬가지로``lazy evaluation ''을 갖는다. 예를 들어, 명령에서
expr {$ v? a : b}
~ 중 하나만에이 또는비 의 가치에 따라 실제로 평가 될 것입니다.$ v. 그러나 전체 표현식이 중괄호로 묶인 경우에만 해당됩니다. 그렇지 않으면, Tcl 파서는에이 과비 호출하기 전에expr 명령.
수학 함수
Tcl은 표현식에서 다음과 같은 수학 함수를 지원합니다.
복근 곤봉로그sqrt 에이코 더블log10사드랑 아신 특급힘탠 껍질 아탄 바닥랜드탄 atan2 fmod일주 천장 저혈당죄 코사인 int싱
복근 arg )
의 절대 값을 반환합니다. arg . Arg 정수 또는 부동 소수점 수 있으며 결과는 동일한 양식으로 반환됩니다.
아 코스 ( arg )
아크 코사인을 반환합니다. arg , 0, pi 라디안 범위입니다. Arg -1,1의 범위 내에 있어야합니다.
아신 ( arg )
호의 사인을 돌려줍니다. arg , -pi / 2, pi / 2 라디안 범위입니다. Arg -1,1의 범위 내에 있어야합니다.
atan ( arg )
아크 탄젠트를 리턴합니다. arg , -pi / 2, pi / 2 라디안 범위입니다.
atan2 ( x, y )
아크 탄젠트를 리턴합니다. 와이 / 엑스 범위는 -pi, pi 라디안입니다. 엑스 과 와이 둘 다 0 일 수는 없습니다.
천장 ( arg )
보다 작지 않은 최소 정수 값을 반환합니다. arg .
코사인( arg )
코사인을 반환합니다. arg 라디안 단위로 측정됩니다.
곤봉( arg )
하이퍼 볼릭 코사인을 반환합니다. arg . 결과로 오버플로가 발생하면 오류가 반환됩니다.
더블( arg )
만약 arg 부동 값이면 arg , 그렇지 않으면 변환합니다. arg 부동으로 변환하고 변환 된 값을 반환합니다.
exp ( arg )
의 지수를 반환합니다. arg , e **로 정의 됨 arg . 결과로 오버플로가 발생하면 오류가 반환됩니다.
바닥( arg )
최대의 정수 치를 돌려줍니다. arg .
fmod ( x, y )
나눗셈의 부동 소수점 나머지를 반환합니다. 엑스 으로 와이 . 만약 와이 0이면 오류가 리턴됩니다.
hypot ( x, y )
직각 삼각형의 빗변의 길이를 계산합니다 ( 엑스 * 엑스 + 와이 * 와이 ).
int ( arg )
만약 arg 정수 값입니다. arg , 그렇지 않으면 변환합니다. arg 을 절단하여 정수로 변환하고 변환 된 값을 리턴합니다.
로그( arg )
의 자연 로그를 반환합니다. arg . Arg 양수 값이어야합니다.
log10 ( arg )
밑줄 10의 대수를 반환합니다. arg . Arg 양수 값이어야합니다.
분말 x, y )
값을 계산합니다. 엑스 권력을 높이다 와이 . 만약 엑스 부정, 와이 정수 값이어야합니다.
랜드()
부동 소수점 수를 0에서 1보다 작거나 수학적으로 범위 0,1에서 반환합니다. 시드는 기계의 내부 클럭에서 유래하거나 매뉴얼 기능으로 설정할 수 있습니다.
일주( arg )
만약 arg 정수 값입니다. arg , 그렇지 않으면 변환합니다. arg 반올림하여 정수로 변환하고 변환 된 값을 반환합니다.
죄( arg )
사인을 구한다. arg 라디안 단위로 측정됩니다.
sinh ( arg )
쌍곡선 사인을 구한다. arg . 결과로 오버플로가 발생하면 오류가 반환됩니다.
sqrt ( arg )
의 제곱근을 구한다. arg . Arg 부가 아닌 값이어야합니다.
사드랑 arg )
그만큼 arg (정수 여야 함)는 난수 생성 프로그램의 시드를 다시 설정하는 데 사용됩니다. 그 seed로부터 최초의 난수를 돌려줍니다. 각 통역사마다 고유 한 시드가 있습니다.
탠 껍질( arg )
탄젠트를 반환합니다. arg 라디안 단위로 측정됩니다.
탄 arg )
쌍곡선 탄젠트를 반환합니다. arg .
이러한 미리 정의 된 기능 외에도 응용 프로그램은 다음을 사용하여 추가 기능을 정의 할 수 있습니다.Tcl_CreateMathFunc().
유형, 오버플로 및 정밀도
정수가 포함 된 모든 내부 계산은 C 유형으로 수행됩니다. 긴 , 부동 소수점을 포함하는 모든 내부 계산은 C 유형으로 수행됩니다 더블 . 문자열을 부동 소수점으로 변환 할 때 지수 오버플로가 감지되어 Tcl 오류가 발생합니다. 문자열에서 정수로 변환하는 경우 오버플로 감지는 로컬 C 라이브러리의 일부 루틴 동작에 따라 달라 지므로 신뢰할 수없는 것으로 간주해야합니다. 어쨌든 정수 오버플로 및 언더 플로는 일반적으로 중간 결과에 대해 안정적으로 감지되지 않습니다. 부동 소수점 오버 플로우 및 언더 플로우는 일반적으로 꽤 안정적인 하드웨어가 지원하는 수준까지 감지됩니다.
정수, 부동 소수점 및 문자열 피연산자에 대한 내부 표현 간의 변환은 필요에 따라 자동으로 수행됩니다. 산술 연산의 경우, 부동 소수점 숫자가 도입 될 때까지 정수가 사용되며 그 후에 부동 소수점이 사용됩니다. 예를 들어,
expr 5 / 4
1을 반환하며
expr 5 / 4.0 expr 5 / (문자열 길이 "abcd" + 0.0)
둘 다 1.25를 반환합니다. 부동 소수점 값은 항상 ".''또는이자형 그래서 그들은 정수 값처럼 보이지 않을 것입니다. 예를 들어,
expr 20.0 / 5.0
보고4.0, 아니라4.
문자열 연산
표현식 평가 기는 가능한 경우 정수 또는 부동 소수점으로 비교를 시도하지만 비교 연산자의 피연산자로 문자열 값을 사용할 수 있습니다. 비교의 피연산자 중 하나가 문자열이고 다른 하나가 숫자 값을 갖는 경우 숫자 피연산자는 C를 사용하여 문자열로 다시 변환됩니다 sprintf 형식 지정자%디 정수와%지 부동 소수점 값의 경우. 예를 들어, 명령
expr { "0x03"> "2"} expr { "0y"< "0x12"}
둘 다 1을 반환합니다. 첫 번째 비교는 정수 비교를 사용하여 수행되고 두 번째 비교는 두 번째 피연산자가 문자열로 변환 된 후 문자열 비교를 사용하여 수행됩니다18. 가능할 때마다 값을 숫자로 취급하려는 Tcl의 경향 때문에 일반적으로 다음과 같은 연산자를 사용하는 것은 좋지 않습니다.==실제로 문자열 비교를 원할 때 피연산자의 값은 임의적 일 수 있습니다. 이 경우에는끈 명령 대신.
성능 고려 사항
최상의 속도와 최소 저장 요구 사항을 위해 표현식을 중괄호로 묶습니다. 이를 통해 Tcl 바이트 코드 컴파일러가 최상의 코드를 생성 할 수 있습니다.
위에서 언급했듯이, 표현식은 Tcl 파서에 의해 한 번, expr 명령. 예를 들어, 명령
3을 설정 b {$ a + 2}를 설정하십시오. expr $ b * 4
return 11, 4의 배수가 아님. Tcl 파서가 처음으로 대체 할 것이기 때문에$ a + 2 변수에 대한비, 그 다음에expr 명령은 표현식을 평가할 것입니다.$ a + 2 * 4.
대부분의 표현식은 두 번째 대체가 필요하지 않습니다. 중괄호로 묶여 있거나, 그렇지 않은 경우 변수 및 명령 대체는 숫자 또는 문자열 자체가 대체가 필요하지 않습니다. 그러나, 몇 가지 칭찬을받지 않는 표현식은 두 번의 대체가 필요하기 때문에 바이트 코드 컴파일러는이 상황을 처리하기 위해 추가 지침을 내 보내야합니다. 가장 비용이 많이 드는 코드는 명령 대체가 포함 된 표현식이없는 표현식에 필요합니다. 이 표현식은 표현식이 실행될 때마다 새 코드를 생성하여 구현해야합니다.
키워드
산술, 부울, 비교, 표현, 퍼지 비교
중대한: 사용 남자 명령 ( % man )를 사용하여 특정 컴퓨터에서 명령이 어떻게 사용되는지 확인하십시오.