# Zero‑Indexing System

---

**Zero‑Indexing System**

- Most programming languages (including Dart) start counting positions from `0`.  
- That means the first character of `"hello"` is at index `0`, the second at `1`, etc.; so `index + 1` gives you the human-friendly position.  
- Because of zero indexing, the last index is always `length - 1`. For `"hello"` (`length == 5`), valid indexes are `0` through `4`.  
- When you iterate over a string or list, use `for (var i = 0; i < myString.length; i++)` so you don’t go past the last element.

```dart
void main() {
  String name = "Ali";
  print(name[2]); // prints 'i'
}
```

- `name[2]` مش property، ده أسلوب للوصول (access) لحرف داخل الـ `String` باستخدام **index operator** (مِش property).  
- `String` في Dart فيها properties زي `length`, `isEmpty`, `runtimeType`; أما `name[2]` فهو **index access** ياخد الحرف اللي على الموقع رقم 2.  
- تقدر تعتبره شغلة من نوع “operator” مش property، لأنك بتستخدم الأقواس `[]` مع رقم.

لو حابب أشرح الفرق بالإنجليزي أو أديك ملخص بـ bullet عن properties vs indexing، قولي.

Operation (عملية)

**Operation (عملية)**  
- عملية هي أي تعبير يمثّل شي بتعمله على قيمة: جمع (`+`)، مقارنة (`==`)، الوصول عبر الفهرس (`name[2]`)، أو استدعاء وظيفة (`trim()`).
- بالنسبة لـ `String` في Dart:
  - `name.length` → property (يعطي عدد الأحرف).
  - `name[2]` → عملية **index operator**: بتشتغل على السلسلة وتُرجع الحرف عند الموقع رقم `2`.
  - `name + "!"` → عملية جمع (concatenation) تنتج سلسلة جديدة.
  - `name.contains("Ali")` → عملية تحقق (method call) ترجع `bool`.
- العمليات ممكن تكون من النوع `operator` (زي `[]`, `+`, `==`) أو `method` (زي `toUpperCase()`)، والفرق إن الـ operator بيشتغل مباشرة على القيمة بدون اسم وظيفة، بينما الـ method هي دالة.

أمثلة بسيطة تبين الفرق إذا حابب؟