# 3. Operators & Strings

## Arithmetic
```stencil
print(10 + 3);   // 13
print(10 - 3);   // 7
print(10 * 3);   // 30
print(10 / 3);   // 3    (integer division when both are ints)
print(10 % 3);   // 1    (remainder)
print(2 * (3 + 4)); // 14 (parentheses group)
```

## Comparison (give a bool)
```stencil
print(5 == 5);   // true
print(5 != 3);   // true
print(3 < 5);    // true
print(5 <= 5);   // true
print(7 > 2);    // true
print(7 >= 9);   // false
```

## Logic
`&&` (and), `||` (or), `!` (not). The keywords `and`, `or`, `not` also work and read nicely:
```stencil
print(true && false);    // false
print(true || false);    // true
print(!true);            // false
print(3 > 2 and 1 == 1); // true
print(not (5 > 10));     // true
```
`&&` and `||` short-circuit (the right side is only evaluated if needed).

## Ternary
A compact if-expression: `condition ? whenTrue : whenFalse`.
```stencil
let age = 20;
print(age >= 18 ? "adult" : "minor");   // adult
```

## Membership: `in`
```stencil
print(2 in [1, 2, 3]);     // true
print("ll" in "hello");    // true
print("k" in { "k": 1 });  // true (checks keys)
```

## Strings
Concatenate with `+`. The other side is auto-converted:
```stencil
let name = "Ada";
print("Hi " + name);        // Hi Ada
print("Age: " + 30);        // Age: 30
```

### f-strings (string interpolation)
Put `f` before the quote; `{expr}` is evaluated and inserted:
```stencil
let name = "Ada";
let age = 30;
print(f"{name} is {age} years old, next year {age + 1}.");
// Ada is 30 years old, next year 31.
```

### String operations
```stencil
let s = "Hello";
print(s.upper());      // HELLO
print(s.lower());      // hello
print(s.len());        // 5
print(s[0]);           // H   (indexing; negatives count from the end)
print(len(s));         // 5
print(upper("hi"), trim("  x  "), split("a,b,c", ","), join(["a","b"], "-"));
```

Next: [Control Flow](04_control_flow.md)
