# 1. Introduction: From Python to C

### 1.1 Key Differences Overview

| Aspect | Python | C |
|--------|--------|---|
| **Compilation** | Interpreted | Compiled |
| **Type System** | Dynamic typing | Static typing |
| **Memory Management** | Automatic | Manual |
| **Syntax Style** | Indentation-based | Brace-based |
| **Performance** | Slower execution | Faster execution |
| **Development Speed** | Faster to write | More verbose |

*Some of you might ask, What does it mean by `Static Typing` vs `Dynamic Typing` ?*

**Dynamic Typing ( Python ):**
- Variables can change their data type during program execution
- Type checking happens at runtime
- No need to declare variable types explicitly
- More flexible but can lead to runtime errors

```python
# Python - Dynamic Typing
x = 5        # x is an integer
x = "Hello"  # Now x is a string (allowed!)
x = 3.14     # Now x is a float (also allowed!)
```

**Static Typing ( C ):**
- Variables must be declared with a specific data type
- Type checking happens at compile time
- Once declared, a variable cannot change its type
- Less flexible but catches type errors before program runs

```c
// C - Static Typing
int x = 5;           // x is declared as integer
x = "Hello";         // ERROR! Cannot assign string to integer variable
float y = 3.14f;     // y must be declared as float to store decimal numbers
```

**Advantages of Static Typing ( C ):**
- Errors caught during compilation, not during execution
- Better performance (no runtime type checking needed)
- More predictable memory usage
- Clearer code documentation (types are explicit)

**Advantages of Dynamic Typing ( Python ):**
- Faster prototyping and development
- More flexible for rapid changes
- Less verbose code
- Easier for beginners to learn
  
### 1.2 Basic Program Structure

**Python:**
```python
# Simple Python program
print("Hello, World!")
```

**C:**
```c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
```

**Key Points:**
- C requires explicit inclusion of header files (such as `#include <stdio.h>`)
- Every C program must have a `main()` function
- C statements end with semicolons (`;`)
- C uses curly braces `{}` to define code blocks
- Functions must explicitly return a value except for void function (we will learn more about this on the next module)