Introduction to Arithmetic Operations in C
C provides a comprehensive set of arithmetic operators for performing mathematical calculations. Understanding these operations is fundamental to C programming, from simple calculations to complex mathematical computations.
Core Arithmetic Operators
Basic Arithmetic Operators
| Operator | Name | Description | Example |
|---|---|---|---|
+ | Addition | Adds two operands | a + b |
- | Subtraction | Subtracts second operand from first | a - b |
* | Multiplication | Multiplies two operands | a * b |
/ | Division | Divides first operand by second | a / b |
% | Modulus | Returns remainder of division | a % b |
Basic Arithmetic Examples
#include <stdio.h> int main() { int a = 10, b = 3; printf("a = %d, b = %d\n", a, b); printf("Addition (a + b) = %d\n", a + b); printf("Subtraction (a - b) = %d\n", a - b); printf("Multiplication (a * b) = %d\n", a * b); printf("Division (a / b) = %d\n", a / b); // Integer division printf("Modulus (a %% b) = %d\n", a % b); // Remainder return 0; } Output:
a = 10, b = 3 Addition (a + b) = 13 Subtraction (a - b) = 7 Multiplication (a * b) = 30 Division (a / b) = 3 Modulus (a % b) = 1
Integer vs Floating-Point Arithmetic
Integer Division vs Floating-Point Division
#include <stdio.h> int main() { int a = 10, b = 3; float x = 10.0, y = 3.0; printf("=== Integer Division ===\n"); printf("10 / 3 = %d\n", 10 / 3); // Result: 3 printf("10 %% 3 = %d\n\n", 10 % 3); // Result: 1 printf("=== Floating-Point Division ===\n"); printf("10.0 / 3.0 = %.2f\n", 10.0 / 3.0); // Result: 3.33 printf("10.0 / 3 = %.2f\n", 10.0 / 3); // Mixed types printf("=== Type Casting ===\n"); printf("(float)10 / 3 = %.2f\n", (float)a / b); // Explicit casting printf("10 / (float)3 = %.2f\n", a / (float)b); // Explicit casting return 0; } Output:
=== Integer Division === 10 / 3 = 3 10 % 3 = 1 === Floating-Point Division === 10.0 / 3.0 = 3.33 10.0 / 3 = 3.33 === Type Casting === (float)10 / 3 = 3.33 10 / (float)3 = 3.33
Operator Precedence and Associativity
Precedence Table (Highest to Lowest)
| Level | Operator | Description | Associativity |
|---|---|---|---|
| 1 | () | Parentheses | Left to Right |
| 2 | ++ -- | Postfix increment/decrement | Left to Right |
| 3 | ++ -- + - ! ~ | Unary operators | Right to Left |
| 4 | * / % | Multiplicative | Left to Right |
| 5 | + - | Additive | Left to Right |
| 6 | << >> | Bitwise shift | Left to Right |
| 7 | < <= > >= | Relational | Left to Right |
| 8 | == != | Equality | Left to Right |
| 9 | & | Bitwise AND | Left to Right |
| 10 | ^ | Bitwise XOR | Left to Right |
| 11 | | | Bitwise OR | Left to Right |
| 12 | && | Logical AND | Left to Right |
| 13 | || | Logical OR | Left to Right |
| 14 | ?: | Ternary conditional | Right to Left |
| 15 | = += -= etc. | Assignment | Right to Left |
| 16 | , | Comma | Left to Right |
Precedence Examples
#include <stdio.h> int main() { int a = 5, b = 3, c = 2; int result; printf("=== Operator Precedence ===\n\n"); // Multiplication before addition result = a + b * c; printf("a + b * c = %d (b * c first)\n", result); // Parentheses override precedence result = (a + b) * c; printf("(a + b) * c = %d\n", result); // Complex expression result = a * b + c / 2 - a % b; printf("a * b + c / 2 - a %% b = %d\n", result); // Step-by-step evaluation printf("\n=== Step-by-step ===\n"); printf("Expression: 5 + 3 * 2 - 8 / 4\n"); printf("Step 1: 5 + 6 - 8 / 4 (3 * 2 = 6)\n"); printf("Step 2: 5 + 6 - 2 (8 / 4 = 2)\n"); printf("Step 3: 11 - 2 (5 + 6 = 11)\n"); printf("Result: 9\n"); return 0; } Compound Assignment Operators
Assignment Operators Table
| Operator | Example | Equivalent to |
|---|---|---|
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
Compound Assignment Examples
#include <stdio.h> int main() { int x = 10; printf("Initial value: x = %d\n", x); x += 5; // x = x + 5 printf("After x += 5: %d\n", x); x -= 3; // x = x - 3 printf("After x -= 3: %d\n", x); x *= 2; // x = x * 2 printf("After x *= 2: %d\n", x); x /= 4; // x = x / 4 printf("After x /= 4: %d\n", x); x %= 3; // x = x % 3 printf("After x %%= 3: %d\n", x); return 0; } Output:
Initial value: x = 10 After x += 5: 15 After x -= 3: 12 After x *= 2: 24 After x /= 4: 6 After x %= 3: 0
Increment and Decrement Operators
Prefix vs Postfix
#include <stdio.h> int main() { int a = 5, b = 5; int result1, result2; printf("=== Prefix vs Postfix ===\n\n"); // Postfix: use then increment result1 = a++; printf("Postfix (a++):\n"); printf(" result = %d (original value used)\n", result1); printf(" a now = %d (after increment)\n", a); printf("\n"); // Prefix: increment then use result2 = ++b; printf("Prefix (++b):\n"); printf(" result = %d (incremented value used)\n", result2); printf(" b now = %d\n", b); printf("\n=== In Expressions ===\n"); int x = 5, y = 5; int z = x++ + ++y; printf("x = 5, y = 5\n"); printf("x++ + ++y = %d\n", z); printf("After: x = %d, y = %d\n", x, y); return 0; } Output:
=== Prefix vs Postfix === Postfix (a++): result = 5 (original value used) a now = 6 (after increment) Prefix (++b): result = 6 (incremented value used) b now = 6 === In Expressions === x = 5, y = 5 x++ + ++y = 11 After: x = 6, y = 6
Bitwise Arithmetic Operations
Bitwise Operators
| Operator | Name | Description |
|---|---|---|
& | AND | Bitwise AND |
| | OR | Bitwise OR |
^ | XOR | Bitwise XOR |
~ | NOT | Bitwise complement |
<< | Left shift | Shift bits left |
>> | Right shift | Shift bits right |
Bitwise Examples
#include <stdio.h> void printBinary(unsigned int n) { for (int i = 31; i >= 0; i--) { printf("%d", (n >> i) & 1); if (i % 8 == 0) printf(" "); } printf("\n"); } int main() { unsigned int a = 60; // 0011 1100 unsigned int b = 13; // 0000 1101 printf("a = %d (", a); printBinary(a); printf("b = %d (", b); printBinary(b); printf("\n=== Bitwise Operations ===\n\n"); printf("a & b = %3d (", a & b); printBinary(a & b); printf("a | b = %3d (", a | b); printBinary(a | b); printf("a ^ b = %3d (", a ^ b); printBinary(a ^ b); printf("~a = %3d (", ~a); printBinary(~a); printf("a << 2 = %3d (", a << 2); printBinary(a << 2); printf("a >> 2 = %3d (", a >> 2); printBinary(a >> 2); return 0; } Output:
a = 60 (00111100 00000000 00000000 00000000 ) b = 13 (00001101 00000000 00000000 00000000 ) === Bitwise Operations === a & b = 12 (00001100 00000000 00000000 00000000 ) a | b = 61 (00111101 00000000 00000000 00000000 ) a ^ b = 49 (00110001 00000000 00000000 00000000 ) ~a = -61 (11000011 11111111 11111111 11111111 ) a << 2 = 240 (11110000 00000000 00000000 00000000 ) a >> 2 = 15 (00001111 00000000 00000000 00000000 )
Type Conversion (Casting)
Implicit vs Explicit Conversion
#include <stdio.h> int main() { printf("=== Implicit Type Conversion ===\n\n"); int i = 10; float f = 3.14; double d = 5.7; // Integer + float -> float float result1 = i + f; printf("int + float: %d + %.2f = %.2f\n", i, f, result1); // Integer + double -> double double result2 = i + d; printf("int + double: %d + %.1f = %.1f\n", i, d, result2); // All mixed double result3 = i + f + d; printf("int + float + double = %.2f\n\n", result3); printf("=== Explicit Type Conversion (Casting) ===\n\n"); int x = 10, y = 3; // Without casting float div1 = x / y; printf("Without casting: %d / %d = %.2f\n", x, y, div1); // With casting float div2 = (float)x / y; printf("With casting: (float)%d / %d = %.2f\n", x, y, div2); // Multiple casts float div3 = (float)x / (float)y; printf("Both cast: (float)%d / (float)%d = %.2f\n", x, y, div3); return 0; } Common Arithmetic Functions
Math Library Functions
#include <stdio.h> #include <math.h> int main() { double x = 25.0; double y = 3.0; printf("=== Math Library Functions ===\n\n"); printf("x = %.2f, y = %.2f\n\n", x, y); printf("sqrt(%.2f) = %.2f\n", x, sqrt(x)); printf("pow(%.2f, %.2f) = %.2f\n", y, y, pow(y, y)); printf("exp(%.2f) = %.2f\n", y, exp(y)); printf("log(%.2f) = %.2f\n", x, log(x)); printf("log10(%.2f) = %.2f\n", x, log10(x)); printf("fabs(%.2f) = %.2f\n", -x, fabs(-x)); printf("ceil(%.2f) = %.2f\n", 3.14, ceil(3.14)); printf("floor(%.2f) = %.2f\n", 3.14, floor(3.14)); printf("round(%.2f) = %.2f\n", 3.5, round(3.5)); printf("\n=== Trigonometric Functions ===\n"); double angle = 45.0; double rad = angle * M_PI / 180.0; printf("sin(%.0f°) = %.4f\n", angle, sin(rad)); printf("cos(%.0f°) = %.4f\n", angle, cos(rad)); printf("tan(%.0f°) = %.4f\n", angle, tan(rad)); return 0; } Note: Compile with -lm flag: gcc program.c -o program -lm
Integer Overflow and Underflow
Understanding Overflow
#include <stdio.h> #include <limits.h> int main() { printf("=== Integer Overflow ===\n\n"); int max = INT_MAX; int min = INT_MIN; printf("INT_MAX = %d\n", max); printf("INT_MIN = %d\n\n", min); // Overflow printf("INT_MAX + 1 = %d (overflow)\n", max + 1); printf("INT_MIN - 1 = %d (underflow)\n\n", min - 1); // Unsigned overflow (wraps around) unsigned int umax = UINT_MAX; printf("UINT_MAX = %u\n", umax); printf("UINT_MAX + 1 = %u (wraps to 0)\n\n", umax + 1); printf("=== Safe Arithmetic ===\n\n"); int a = 2000000000; int b = 2000000000; // Dangerous int dangerous = a + b; printf("%d + %d = %d (may overflow)\n", a, b, dangerous); // Safe check if (a > INT_MAX - b) { printf("Overflow would occur!\n"); } else { int safe = a + b; printf("Safe result: %d\n", safe); } return 0; } Advanced Arithmetic Techniques
Efficient Multiplication and Division by Powers of 2
#include <stdio.h> int main() { int x = 42; printf("x = %d\n\n", x); // Multiplication by 2 (faster with shift) printf("x * 2 = %d\n", x * 2); printf("x << 1 = %d (shift)\n\n", x << 1); // Division by 2 (faster with shift) printf("x / 2 = %d\n", x / 2); printf("x >> 1 = %d (shift)\n\n", x >> 1); // Multiplication by 4 printf("x * 4 = %d\n", x * 4); printf("x << 2 = %d (shift)\n\n", x << 2); // Check if number is odd/even printf("x %% 2 = %d (remainder)\n", x % 2); printf("x & 1 = %d (bitwise AND)\n\n", x & 1); // Swap without temporary variable int a = 5, b = 3; printf("Before swap: a = %d, b = %d\n", a, b); a = a + b; b = a - b; a = a - b; printf("After swap (addition): a = %d, b = %d\n", a, b); // Reset a = 5; b = 3; // XOR swap (for integers) a = a ^ b; b = a ^ b; a = a ^ b; printf("After swap (XOR): a = %d, b = %d\n", a, b); return 0; } Common Pitfalls and Best Practices
1. Integer Division Gotchas
#include <stdio.h> int main() { // Wrong way float result1 = 5 / 2; // Does integer division first printf("5 / 2 = %.2f (WRONG - integer division)\n", result1); // Right way float result2 = 5.0 / 2; // Float division float result3 = (float)5 / 2; // Explicit cast printf("5.0 / 2 = %.2f (CORRECT)\n", result2); printf("(float)5 / 2 = %.2f (CORRECT)\n\n", result3); return 0; } 2. Modulo with Negative Numbers
#include <stdio.h> int main() { printf("=== Modulo with Negative Numbers ===\n\n"); printf("5 %% 3 = %d\n", 5 % 3); printf("-5 %% 3 = %d\n", -5 % 3); printf("5 %% -3 = %d\n", 5 % -3); printf("-5 %% -3 = %d\n\n", -5 % -3); // Note: Result sign follows dividend in C printf("Note: In C, result sign follows dividend\n"); return 0; } 3. Operator Precedence Confusion
#include <stdio.h> int main() { int a = 5, b = 3, c = 2; // What does this do? int result = a << b + c; // Actually a << (b + c), not (a << b) + c printf("a << b + c = %d\n", result); printf("Because: b + c = %d, then a << %d = %d\n", b + c, b + c, result); // Use parentheses for clarity int correct = (a << b) + c; printf("(a << b) + c = %d\n", correct); return 0; } 4. Floating-Point Precision
#include <stdio.h> #include <math.h> int main() { printf("=== Floating-Point Precision ===\n\n"); double a = 0.1; double b = 0.2; double c = a + b; printf("0.1 + 0.2 = %.20f\n", c); printf("Expected: 0.3\n"); // Never compare floating-point directly if (c == 0.3) { printf("Equal! (this won't print)\n"); } else { printf("Not equal due to precision\n"); } // Use epsilon comparison double epsilon = 0.0000001; if (fabs(c - 0.3) < epsilon) { printf("Equal within epsilon\n"); } return 0; } Performance Considerations
Optimization Techniques
#include <stdio.h> int main() { int x = 1000; printf("=== Performance Optimizations ===\n\n"); // Multiplication/division by powers of 2 printf("x * 8 = %d\n", x * 8); printf("x << 3 = %d (faster)\n\n", x << 3); // Modulo by powers of 2 printf("x %% 8 = %d\n", x % 8); printf("x & 7 = %d (faster)\n\n", x & 7); // Check even/odd printf("Is x even? "); if ((x & 1) == 0) { printf("Yes (using bitwise)\n"); } return 0; } Benchmark Example
#include <stdio.h> #include <time.h> int main() { const int iterations = 10000000; clock_t start, end; double cpu_time_used; volatile int result = 0; printf("=== Performance Benchmark ===\n\n"); // Multiplication start = clock(); for (int i = 0; i < iterations; i++) { result = i * 8; } end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Multiplication: %.3f seconds\n", cpu_time_used); // Shift start = clock(); for (int i = 0; i < iterations; i++) { result = i << 3; } end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Shift: %.3f seconds (faster)\n", cpu_time_used); return 0; } Advanced Examples
1. Complex Number Arithmetic
#include <stdio.h> #include <complex.h> int main() { double complex z1 = 1.0 + 2.0 * I; double complex z2 = 2.0 + 3.0 * I; printf("z1 = %.2f + %.2fi\n", creal(z1), cimag(z1)); printf("z2 = %.2f + %.2fi\n\n", creal(z2), cimag(z2)); double complex sum = z1 + z2; double complex diff = z1 - z2; double complex prod = z1 * z2; double complex quot = z1 / z2; printf("Sum: %.2f + %.2fi\n", creal(sum), cimag(sum)); printf("Difference: %.2f + %.2fi\n", creal(diff), cimag(diff)); printf("Product: %.2f + %.2fi\n", creal(prod), cimag(prod)); printf("Quotient: %.2f + %.2fi\n", creal(quot), cimag(quot)); return 0; } 2. Matrix Multiplication
#include <stdio.h> #define SIZE 3 void matrix_multiply(int a[SIZE][SIZE], int b[SIZE][SIZE], int result[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { result[i][j] = 0; for (int k = 0; k < SIZE; k++) { result[i][j] += a[i][k] * b[k][j]; } } } } void print_matrix(int matrix[SIZE][SIZE], char *name) { printf("%s:\n", name); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%4d ", matrix[i][j]); } printf("\n"); } printf("\n"); } int main() { int a[SIZE][SIZE] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int b[SIZE][SIZE] = { {9, 8, 7}, {6, 5, 4}, {3, 2, 1} }; int result[SIZE][SIZE]; print_matrix(a, "Matrix A"); print_matrix(b, "Matrix B"); matrix_multiply(a, b, result); print_matrix(result, "A × B"); return 0; } Best Practices Summary
Do's and Don'ts
// DO: Use parentheses for complex expressions int result = (a + b) * (c - d); // DON'T: Rely on operator precedence int wrong = a + b * c - d; // Confusing // DO: Check for overflow if (a > INT_MAX - b) { printf("Overflow would occur\n"); } // DON'T: Ignore overflow int dangerous = a + b; // May overflow silently // DO: Use explicit casts for mixed types float result = (float)a / b; // DON'T: Mix types without understanding float wrong = a / b; // Integer division first! // DO: Use bitwise ops for performance when appropriate int multiplied = x << 3; // x * 8 // DON'T: Use bitwise ops for readability int confusing = x << 3; // Is this multiplication or shift? Conclusion
This comprehensive guide covers all aspects of arithmetic operations in C:
Key Takeaways
- Basic operators (+, -, *, /, %) for fundamental arithmetic
- Operator precedence determines evaluation order
- Integer vs floating-point division behaves differently
- Type conversion affects calculation results
- Overflow/underflow can cause subtle bugs
- Bitwise operations provide low-level control
- Math library offers advanced functions
- Performance considerations matter for critical code
Best Practices
- Always consider type sizes and overflow
- Use parentheses for clarity
- Be careful with integer division
- Avoid comparing floating-point directly
- Use bitwise operations for performance when appropriate
- Test edge cases (zero, negative numbers, large values)
Mastering these concepts is essential for writing correct, efficient C programs.
Complete C Programming Guide + Compilers Collection
1. C srand() Function – Understanding Seed Initialization
https://macronepal.com/understanding-the-c-srand-function
Explains how srand() initializes the pseudo-random number generator in C by setting a seed value. Using the same seed produces the same sequence, while time(NULL) gives different results each run.
2. C rand() Function Mechanics and Limitations
https://macronepal.com/c-rand-function-mechanics-and-limitations
Explains how rand() generates pseudo-random numbers between 0 and RAND_MAX, its deterministic nature, and limitations for security use cases.
3. C log() Function
https://macronepal.com/c-log-function-2
Covers natural logarithm calculation using <math.h> and its applications.
4. Mastering Date and Time in C
https://macronepal.com/mastering-date-and-time-in-c
Explains <time.h> functions like time(), clock(), difftime(), and struct tm.
5. Mastering time_t Type in C
https://macronepal.com/mastering-the-c-time_t-type-for-time-management
Explains time representation as seconds since Unix epoch and conversion functions.
6. C exp() Function
https://macronepal.com/c-exp-function-mechanics-and-implementation
Explains exponential function exp(x) and its scientific applications.
7. C log() Function (Alternate Guide)
https://macronepal.com/c-log-function
Comparison of log() and log10() with usage examples.
8. C log10() Function
https://macronepal.com/mastering-the-log10-function-in-c
Explains base-10 logarithm for engineering and scientific applications.
9. C tan() Function
https://macronepal.com/understanding-the-c-tan-function
Explains tangent function and radian-based calculations.
10. Random Numbers in C (Secure vs Predictable)
https://macronepal.com/mastering-c-random-numbers-for-secure-and-predictable-applications
Explains difference between rand() and secure randomness methods.
11. Free Online C Compiler
https://macronepal.com/free-online-c-code-compiler-2
Browser-based compiler for testing C programs instantly.
C Functions, Arguments, Parameters & Flow
Mastering Functions in C – Complete Guide
https://macronepal.com/c/mastering-functions-in-c-a-complete-guide/
Covers function structure, modular programming, and real-world usage.
Function Arguments in C
https://macronepal.com/c-function-arguments/
Explains how arguments are passed and used in function calls.
Function Parameters in C
https://macronepal.com/c-function-parameters/
Explains defining inputs for functions and matching them with arguments.
Function Declarations in C
https://macronepal.com/c-function-declarations-syntax-rules-and-best-practices/
Covers prototypes, syntax rules, and best practices.
Function Calls in C
https://macronepal.com/understanding-function-calls-in-c-syntax-mechanics-and-best-practices/
Explains execution flow and parameter handling during function calls.
Void Functions in C
https://macronepal.com/understanding-void-functions-in-c-syntax-patterns-and-best-practices/
Explains functions that do not return values.
Return Values in C
https://macronepal.com/c-return-values-mechanics-types-and-best-practices/
Explains different return types and how functions return results.
Pass-by-Value in C
https://macronepal.com/aws/understanding-pass-by-value-in-c-mechanics-implications-and-best-practices/
Explains how copies of variables are passed into functions.
Pass-by-Reference in C
https://macronepal.com/c/understanding-pass-by-reference-in-c-pointers-semantics-and-safe-practices/
Explains using pointers to modify original variables.
C strstr() Function
https://macronepal.com/aws/c-strstr-function/
Explains substring search inside strings in C.
C Preprocessor & Macros
https://macronepal.com/mastering-c-variadic-macros-for-flexible-debugging/
https://macronepal.com/mastering-the-stdc-macro-in-c/
https://macronepal.com/c-time-macro-mechanics-and-usage/
https://macronepal.com/understanding-the-c-date-macro/
https://macronepal.com/c-file-type/
https://macronepal.com/mastering-c-line-macro-for-debugging-and-diagnostics/
https://macronepal.com/mastering-predefined-macros-in-c/
https://macronepal.com/c-error-directive-mechanics-and-usage/
https://macronepal.com/understanding-the-c-pragma-directive/
https://macronepal.com/c-include-directive/
C Structures, Memory, Scope & Linkage
https://macronepal.com/mastering-structures-in-c/
https://macronepal.com/c-structure-declaration-mechanics-and-usage/
https://macronepal.com/c-structure-initialization-mechanics-and-best-practices/
https://macronepal.com/mastering-c-structure-member-access-for-reliable-data-handling/
https://macronepal.com/c-nested-structures/
https://macronepal.com/mastering-arrays-of-structures-in-c/
https://macronepal.com/c-structure-pointers-mechanics-and-implementation/
https://macronepal.com/understanding-c-structure-parameter-passing-mechanics/
https://macronepal.com/mastering-c-returning-structures-for-efficient-data-flow/
https://macronepal.com/c-self-referential-structures/
https://macronepal.com/mastering-structure-alignment-in-c/
https://macronepal.com/c-structure-padding-mechanics-and-optimization/
https://macronepal.com/understanding-c-flexible-array-members-mechanics-and-usage/
https://macronepal.com/mastering-c-anonymous-structures-for-flattened-data-layouts/
https://macronepal.com/c-unions/
https://macronepal.com/mastering-c-name-mangling-and-symbol-decoration/
https://macronepal.com/c-no-linkage-mechanics-and-scope-isolation/
https://macronepal.com/understanding-c-internal-linkage-mechanics-and-architecture/
C Scope, Storage Classes & Typedef
https://macronepal.com/mastering-function-prototype-scope-in-c/
https://macronepal.com/c-function-scope-mechanics-and-visibility/
https://macronepal.com/understanding-c-file-scope-mechanics-and-architecture/
https://macronepal.com/mastering-c-scope-rules-for-predictable-name-resolution/
https://macronepal.com/c-scope-rules/
https://macronepal.com/mastering-c-register-storage-class-for-historical-context-and-modern-alternatives/
https://macronepal.com/mastering-_thread_local-in-c/
https://macronepal.com/c-extern-storage-class-mechanics-and-usage/
https://macronepal.com/understanding-the-c-static-storage-class-mechanics-and-usage/
https://macronepal.com/c-auto-storage-class/
https://macronepal.com/c-typedef-with-pointers/
Extra Articles
https://macronepal.com/13757-2/
https://macronepal.com/13748-2/
https://macronepal.com/13747-2/
https://macronepal.com/13746-2/
https://macronepal.com/13745-2/
https://macronepal.com/13708-2/
https://macronepal.com/13707-2/
https://macronepal.com/13702-2/
Online Compilers
https://macronepal.com/free-html-online-code-compiler/
https://macronepal.com/free-online-python-code-compiler/
https://macronepal.com/free-online-python2-code-compiler/
https://macronepal.com/free-online-java-code-compiler/
https://macronepal.com/free-online-javascript-code-compiler/
https://macronepal.com/free-online-node-js-code-compiler/
https://macronepal.com/free-online-c-code-compiler/
https://macronepal.com/free-online-c-code-compiler-2/
https://macronepal.com/free-online-c-code-compiler-3/
https://macronepal.com/free-online-php-code-compiler/
https://macronepal.com/free-online-ruby-code-compiler/
https://macronepal.com/free-online-perl-code-compiler/
https://macronepal.com/free-online-lua-code-compiler/
https://macronepal.com/free-online-tcl-code-compiler/
https://macronepal.com/free-online-groovy-code-compiler/
https://macronepal.com/free-online-j-shell-code-compiler/
https://macronepal.com/free-online-haskell-code-compiler/
https://macronepal.com/free-online-scala-code-compiler/
https://macronepal.com/free-online-common-lisp-code-compiler/
https://macronepal.com/free-online-d-code-compiler/
https://macronepal.com/free-online-ada-code-compiler/
https://macronepal.com/free-erlang-code-compiler/
https://macronepal.com/free-online-assembly-code-compiler/
