Chapter 08. Tcl-Operator

연산자는 컴파일러 해석기에게 수학적 계산이나 논리적 계산을 수행하도록 합니다.
Tcl 언어에서는 내장된 연산자가 풍부하며, 다음과 같은 연산자를 제공하고 있습니다.

  • 산술 연산자
  • 관계 연산자
  • 논리 연산자
  • 비트 연산자
  • 삼항 연산자

본 장에서는 산술 연산자, 관계 연산자, 논리 연산자, 비트 연산자와 삼항 연산자에
대해서 하나씩 설명하도록 하겠습니다.

산술연산자


다음의 표는 Tcl 언어에서 제공하는 산술 연산자를 표시했습니다.
A변수의 값은 10, B변수의 값은 20으로 간주하고 설명하도록 하겠습니다.

Operator Description Example
+ 두개의 오퍼런드를 더합니다. A + B = 30
- 두번째 오퍼런드에서 첫번째 오퍼런드값을 뺍니다. A - B = -10
* 양쪽 오퍼런드를 곱합니다. A * B = 200
/ 젯수를 피젯수를 나눕니다. B / A = 2
% 나머지연산자로서 정수 나눗셈을 수행하고 몫을 반환합니다. B % A = 0

예제

다음의 예제는 Tcl 언어에서 제공하는 산술 연산자를 사용하는 간단한 예제입니다.

#!/usr/bin/tclsh

set a 21
set b 10

set c [expr $a + $b]
puts "Line 1 - Value of c is $c\n"

set c [expr $a - $b]
puts "Line 2 - Value of c is $c\n"

set c [expr $a * $b]
puts "Line 3 - Value of c is $c\n"

set c [expr $a / $b]
puts "Line 4 - Value of c is $c\n"

set c [expr $a % $b]
puts "Line 5 - Value of c is $c\n"

상기의 코드를 실행하면 다음과 같이 표시됩니다.

Line 1 - Value of c is 31
Line 2 - Value of c is 11
Line 3 - Value of c is 210
Line 4 - Value of c is 2
Line 5 - Value of c is 1

관계 연산자


다음의 표는 Tcl 언어에서 제공하는 관계 연산자를 표시합니다.
A변수의 값은 10으로 지정하고, B변수의 값은 20으로 지정한 후 수행합니다.

Operator Description Example
== 두개의 오퍼런드를 같은지 비교합니다. 만약 같다면 true 값을 리턴합니다. (A == B) ===> true
!= 두개의 오퍼런드를 같지않은지 비교합니다. 만약 같지 않다면 true 값을 리턴합니다. (A != B) ===> true
> 좌측의 오퍼런드가 우측 오퍼런드보다 크다면 true 값을 리턴합니다. (A > B) ===> false
< 좌측의 오퍼런드가 우측의 오퍼런드보다 작다면 true 값을 리턴합니다. (A < B) ===> true
>= 좌측의 오퍼런드가 우측의 오퍼런드와 같거나 크다면 true 값을 리턴합니다. (A >= B) ===> false
<= 좌측의 오퍼런드가 우측의 오퍼런드보다 작거나 같다면 true 값을 리턴합니다. (A <= B) ===> true

예제

다음의 예제는 Tcl 언어에서 제공하는 관계 연산자를 사용하는 간단한 예제입니다.

#!/usr/bin/tclsh 

set a 21
set b 10

if { $a == $b } {
    puts "Line 1 - a is equal to b\n"
} else {
    puts "Line 1 - a is not equal to b\n"
}

if { $a < $b } {
    puts "Line 2 - a is less than b\n"
} else {
    puts "Line 2 - a is not less than b\n"
}

if { $a > $b } {
    puts "Line 3 - a is greater than b\n"
} else {
    puts "Line 3 - a is not greater than b\n"
}

# Let's Change Value of a and b
set a 5
set b 20

if { $a <= $b } {
    puts "Line 4 - a is either less than or equal to b\n"
}

if { $b >= $a } {
    puts "Line 5 - b is either greater than or equal to b\n"
}

상기의 코드를 실행하면 다음과 같은 결과를 화면에 표시합니다.

Line 1 - a is not equal to b
Line 2 - a is not less than b
Line 3 - a is greater than b
Line 4 - a is either less than or equal to -b
Line 5 - b is either greater than or equal to a

논리 연산자


다음의 표는 Tcl 언어에서 제공하는 논리 연산자를 표시합니다.
A변수의 값은 1을 설정하고, B변수의 값은 0으로 설정합니다.

Operator Description Example
&& 논리 AND 명령을 수행합니다. 만약 두개의 오퍼런드 모두 1일경우에만 true 값을 리턴합니다. (A && B) ===> false
\ \ 논리 OR 명령을 수행합니다. 만약 두개의 오퍼런드중 한개라도 1인경우 true 값을 리턴합니다. (A \ \ B) ===> true
! 논리 NOT 명령을 수행합니다. 논리상태를 반전합니다. 만약 a 변수에 적용하면 false값으로 리턴합니다. !(A && B) ===> true

예제

다음의 예제는 Tcl 언어에서 제공하는 논리 연산자를 사용하는 간단한 예제입니다.

#!/usr/bin/tclsh

set a 5
set b 20

if { $a && $b } {
    puts "Line 1 - Condition is true\n"
} 

if { $a || $b } {
    puts "Line 2 - Condition is true\n"
}

# Let's Change the value of a and b
set a 0
set b 10

if { $a && $b } {
    puts "Line 3 - Condition is true\n"
} else {
    puts "Line 3 - Condition is not true\n"
}

if { !($a && $b) } {
    puts "Line 4 - Condition is true\n"
}

상기의 코드를 실행하면 다음과 같이 화면에 표시됩니다.

Line 1 - Condition is true
Line 2 - Condition is true
Line 3 - Condition is not true
Line 4 - Condition is true

비트 연산자


비트 연산자는 해당 변수의 비트값으로 연산을 수행합니다.
&(AND), |(OR), ^(XOR) 연산자들이 존재합니다.

p q p & q p \ q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

만약에 A = 60; B = 13일 경우에 비트의 값은 다음과 같이 설정되며, 연산됩니다.

A = 0011 1100
B = 0000 1101 
--------------------------

A & B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001

Tcl 언어에서 제공되는 비트 연산자는 다음과 같습니다.
A 변수는 60으로 설정하고, B 변수는 13으로 설정합니다.

Operator Description Example
& 이진 AND 명령을 수행합니다. 두 오퍼런드의 비트가 둘다 1일경우에만 1로 설정됩니다. (A & B) ===> 12 : 0000 1100
\ 이진 OR 명령을 수행합니다. 두 오퍼런드의 비트값중 하나라도 1이면 1로 설정됩니다. (A \ B) ===> 61 : 0011 1101
^ 이진 XOR 명령을 수행합니다. 두 오퍼런드이 값이 0,1 동일할 경우만 1로 설정됩니다. (A ^ B) ===> 49 : 0011 0001
<< 이진 Left Shift 명령을 수행합니다. 좌측 오퍼런드의 비트값을 우측오퍼런드의 값만큼 좌측으로 비트 이동합니다. A << 2 ===> 240 : 1111 0000
>> 이진 Right Shift 명령을 수행합니다. 좌측 오퍼런드의 비트값을 우측 오퍼런드의 값만큼 우측으로 비트이동합니다. A >> 2 ===> 15 : 0000 1111

예제

Tcl 언어에서 제공하는 비트연산자를 사용하는 간단한 예제는 다음과 같습니다.

#!/usr/bin/tclsh

set a 60 ;# 60 = 0011 1100
set b 13 ;# 13 = 0000 1101

set c [expr $a & $b] ;# 12 = 0000 1100
puts "Line 1 - Value of c is $c\n"

set c [expr $a | $b;] ;# 61 = 0011 1101
puts "Line 2 - Value of c is $c\n"

set c [expr $a ^ $b;] ;# 49 = 0011 0001
puts "Line 3 - Value of c is $c\n"

set c [expr $a << 2] ;# 240 = 1111 0000
puts "Line 4 - Value of c is $c\n"

set c [expr $a >> 2] ;# 15 = 0000 1111
puts "Line 5 - Value of c is $c\n"

상기의 코드를 실행하면 다음과 같이 결과가 화면에 표시됩니다.

Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is 240
Line 5 - Value of c is 15

삼항 연산자


Operator Description Example
? : 평가식을 수행한 후 참일경우과 거짓일 경우에 해당 값으로 설정합니다. 조건 ? 참일경우 설정값 : 거짓일 경우 값

예제

Tcl 언어에서 제공하는 삼항 연산자를 사용하는 예제는 다음과 같습니다.

#!/usr/bin/tclsh

set a 10;

set b [expr $a == 1 ? 20 : 30]
puts "Value of b is $b\n"

set b [expr $a == 10 ? 20 : 30]
puts "Value of b is $b\n"

상기의 코드를 실행하면 다음과 같이 화면에 결과가 표시됩니다.

Value of b is 30
Value of b is 20

연산자 우선순위


연산자 우선순위는 평가식에서 계산순서를 암시적으로 제어합니다.
기본적인 예로서 x = 7 + 3 * 2 의 평가식에서는 * 연산자가 + 연산자보다
우선순위가 높으므로 먼저계산 되므로, 20이 아닌 13으로 값이 설정됩니다.

다음의 표에서 연산자 우선순위가 높은것이 위쪽에 나타나고 아래로 갈수록
연산자 우선순위가 낮아지는 표입니다. 연산자 우선순위가 높을수록 먼저 계산됩니다.

Category Operator Associativity
Unary + - Right to Left
Multipleicative * / % Left to Right
Additive + - Left to Right
Shift << >> Left to Right
Relational < <= > >= Left to Right
Bitwise AND & Left to Right
Bitwise XOR ^ Left to Right
Bitwise OR \ Left to Right
Logical AND && Left to Right
Logical OR \ \ Left to Right
Ternary ? : Right to Left

예제

다음의 예제는 Tcl 언어에서 사용되는 연산자 우선순위에 대한 간단한 예제입니다.

#!/usr/bin/tclsh

set a 20
set b 10
set c 15
set d 5

set e [expr [expr $a + $b] * $c / $d ] ;# ( 30 * 15 ) / 5
puts "Value of (a + b) * c / d is : $e\n"

set e [expr [expr [expr $a + $b] * $c] / $d] ;# (30 * 15 ) / 5]
puts "Value of ((a + b) * c) / d is : $e\n"

set e [expr [expr $a + $b] * [expr $c / $d] ] ;# (30) * (15/5)
puts "Value of (a + b) * (c / d) is : $e\n"

set e [expr $a + [expr $b * $c ] / $d ] ;# 20 + (150/5)
puts "Value of a + (b * c) / d is : $e\n"

상기의 코드를 실행하면, 다음과 같은 결과가 화면에 표시됩니다.

Value of (a + b) * c / d is : 90
Value of ((a + b) * c) / d is : 90
Value of (a + b) * (c / d) is : 90
Value of a + (b * c) / d is : 50

results matching ""

    No results matching ""