In the world of C programming, loops provide the foundation for repetition, but sometimes you need more granular control over loop execution. The break and continue statements are powerful tools that give you precise control over loop behavior. Whether you need to exit a loop early, skip certain iterations, or restructure complex loop logic, these statements are essential additions to every C programmer's toolkit.
Understanding Break and Continue
Both break and continue are jump statements that alter the normal flow of loop execution:
break: Terminates the loop immediately and transfers execution to the statement following the loopcontinue: Skips the remaining code in the current iteration and jumps to the next iteration
The Break Statement
1. Basic Break Usage
#include <stdio.h> int main() { printf("Break Example - Exit loop at 5:\n"); for (int i = 1; i <= 10; i++) { if (i == 5) { printf(" Breaking at i = %d\n", i); break; // Exit the loop } printf(" i = %d\n", i); } printf("Loop ended\n"); return 0; } Output:
Break Example - Exit loop at 5: i = 1 i = 2 i = 3 i = 4 Breaking at i = 5 Loop ended
2. Break in Different Loop Types
#include <stdio.h> int main() { // Break in while loop printf("While loop with break:\n"); int i = 1; while (i <= 10) { if (i == 5) { printf(" Breaking at %d\n", i); break; } printf(" %d ", i); i++; } printf("\n\n"); // Break in do-while loop printf("Do-while loop with break:\n"); i = 1; do { if (i == 4) { printf(" Breaking at %d\n", i); break; } printf(" %d ", i); i++; } while (i <= 10); printf("\n\n"); // Break in infinite loop printf("Infinite loop with break:\n"); int counter = 0; while (1) { // Infinite loop counter++; printf(" Iteration %d\n", counter); if (counter >= 5) { printf(" Breaking infinite loop\n"); break; } } return 0; } 3. Break in Nested Loops
#include <stdio.h> int main() { printf("Break in nested loops:\n"); for (int i = 1; i <= 3; i++) { printf("Outer loop i = %d\n", i); for (int j = 1; j <= 5; j++) { if (j == 3) { printf(" Breaking inner loop at j = %d\n", j); break; // Only breaks inner loop } printf(" j = %d\n", j); } printf("Back to outer loop\n\n"); } printf("All loops complete\n"); return 0; } 4. Breaking Outer Loops (Using Flags)
#include <stdio.h> #include <stdbool.h> int main() { printf("Breaking outer loop using flag:\n"); bool should_break = false; for (int i = 1; i <= 5 && !should_break; i++) { printf("Outer i = %d\n", i); for (int j = 1; j <= 5; j++) { if (i * j > 10) { printf(" Product %d exceeds 10, breaking all loops\n", i * j); should_break = true; break; } printf(" i=%d, j=%d, product=%d\n", i, j, i * j); } if (should_break) break; // Additional break for outer loop } printf("Loop terminated\n"); return 0; } 5. Break with goto (Alternative for Nested Loops)
#include <stdio.h> int main() { printf("Using goto to break nested loops:\n"); for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { for (int k = 1; k <= 3; k++) { printf("i=%d, j=%d, k=%d\n", i, j, k); if (i == 2 && j == 2 && k == 2) { printf("Found target, breaking all loops\n"); goto found; // Jump directly out of all loops } } } } found: printf("Program continues after nested loops\n"); return 0; } The Continue Statement
1. Basic Continue Usage
#include <stdio.h> int main() { printf("Continue Example - Skip even numbers:\n"); for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; // Skip even numbers } printf(" %d ", i); } printf("\n\n"); printf("Skip multiples of 3:\n"); for (int i = 1; i <= 15; i++) { if (i % 3 == 0) { printf(" (skipping %d) ", i); continue; } printf(" %d ", i); } printf("\n"); return 0; } Output:
Continue Example - Skip even numbers: 1 3 5 7 9 Skip multiples of 3: 1 2 (skipping 3) 4 5 (skipping 6) 7 8 (skipping 9) 10 11 (skipping 12) 13 14 (skipping 15)
2. Continue in Different Loop Types
#include <stdio.h> int main() { // Continue in while loop printf("While loop with continue:\n"); int i = 0; while (i < 10) { i++; if (i % 2 == 0) { continue; // Skip even numbers } printf(" %d ", i); } printf("\n\n"); // Continue in do-while loop printf("Do-while loop with continue:\n"); i = 0; do { i++; if (i % 3 == 0) { continue; // Skip multiples of 3 } printf(" %d ", i); } while (i < 15); printf("\n\n"); // Important: In while/do-while, ensure increment before continue printf("Correct vs Incorrect continue in while:\n"); // WRONG - infinite loop /* int j = 0; while (j < 10) { if (j % 2 == 0) { continue; // Infinite loop - j never increments! } printf("%d ", j); j++; } */ // RIGHT - increment before continue int k = 0; while (k < 10) { k++; if (k % 2 == 0) { continue; } printf(" %d ", k); } printf("\n"); return 0; } 3. Continue in Nested Loops
#include <stdio.h> int main() { printf("Continue in nested loops:\n"); for (int i = 1; i <= 3; i++) { printf("Outer i = %d: ", i); for (int j = 1; j <= 5; j++) { if (j == 3) { continue; // Skip j=3 in inner loop } printf("%d ", j); } printf("\n"); } return 0; } Output:
Continue in nested loops: Outer i = 1: 1 2 4 5 Outer i = 2: 1 2 4 5 Outer i = 3: 1 2 4 5
Practical Applications
1. Input Validation with Continue
#include <stdio.h> #include <ctype.h> int main() { char input[100]; int valid_count = 0; printf("Enter 5 valid numbers (enter 'q' to quit early):\n"); while (valid_count < 5) { printf("Enter number %d: ", valid_count + 1); fgets(input, sizeof(input), stdin); // Check for quit command if (tolower(input[0]) == 'q') { printf("Quitting early\n"); break; } // Validate input int num; if (sscanf(input, "%d", &num) != 1) { printf("Invalid input, try again\n"); continue; // Skip to next iteration } // Additional validation if (num < 0 || num > 100) { printf("Number must be between 0 and 100, try again\n"); continue; // Skip to next iteration } printf("Valid number: %d\n", num); valid_count++; } printf("Program ended. %d valid numbers entered.\n", valid_count); return 0; } 2. Data Filtering with Continue
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ARRAY_SIZE 20 int main() { // Generate random array int numbers[ARRAY_SIZE]; srand(time(NULL)); printf("Original array:\n"); for (int i = 0; i < ARRAY_SIZE; i++) { numbers[i] = rand() % 100; // 0-99 printf("%3d ", numbers[i]); if ((i + 1) % 10 == 0) printf("\n"); } printf("\n\n"); // Process with continue - filter conditions printf("Numbers that are multiples of 3 and greater than 30:\n"); int found = 0; for (int i = 0; i < ARRAY_SIZE; i++) { // Skip if not multiple of 3 if (numbers[i] % 3 != 0) { continue; } // Skip if <= 30 if (numbers[i] <= 30) { continue; } printf("%3d ", numbers[i]); found++; if (found % 5 == 0) printf("\n"); } if (found == 0) { printf("No numbers match the criteria\n"); } printf("\n"); return 0; } 3. Menu System with Break
#include <stdio.h> #include <stdlib.h> void display_menu() { printf("\n=== MAIN MENU ===\n"); printf("1. Option 1\n"); printf("2. Option 2\n"); printf("3. Option 3\n"); printf("4. Settings\n"); printf("5. Exit\n"); printf("Enter choice: "); } void option1() { printf("\n--- Option 1 Selected ---\n"); printf("Press Enter to continue..."); getchar(); getchar(); } void option2() { printf("\n--- Option 2 Selected ---\n"); printf("Press Enter to continue..."); getchar(); getchar(); } void option3() { printf("\n--- Option 3 Selected ---\n"); printf("Press Enter to continue..."); getchar(); getchar(); } void settings() { int running = 1; while (running) { printf("\n--- SETTINGS ---\n"); printf("a. Change Color\n"); printf("b. Change Sound\n"); printf("c. Change Difficulty\n"); printf("d. Back to Main Menu\n"); printf("Enter choice: "); char choice = getchar(); getchar(); // Clear newline switch (choice) { case 'a': printf("Color changed\n"); break; case 'b': printf("Sound changed\n"); break; case 'c': printf("Difficulty changed\n"); break; case 'd': printf("Returning to main menu\n"); running = 0; // Exit settings loop break; default: printf("Invalid choice\n"); } } } int main() { int running = 1; while (running) { display_menu(); int choice; scanf("%d", &choice); getchar(); // Clear newline switch (choice) { case 1: option1(); break; case 2: option2(); break; case 3: option3(); break; case 4: settings(); break; case 5: printf("Exiting program...\n"); running = 0; // Exit main loop break; default: printf("Invalid choice, try again\n"); } } printf("Goodbye!\n"); return 0; } 4. Prime Number Generator with Break
#include <stdio.h> #include <stdbool.h> #include <math.h> bool is_prime(int n) { if (n <= 1) return false; if (n <= 3) return true; if (n % 2 == 0 || n % 3 == 0) return false; int limit = sqrt(n); for (int i = 5; i <= limit; i += 6) { if (n % i == 0 || n % (i + 2) == 0) { return false; // Found divisor, not prime } } return true; } int main() { printf("Prime numbers up to 100:\n"); for (int i = 2; i <= 100; i++) { if (is_prime(i)) { printf("%d ", i); } } printf("\n\n"); // Find first 20 primes printf("First 20 prime numbers:\n"); int count = 0; int num = 2; while (1) { // Infinite loop with break if (is_prime(num)) { printf("%d ", num); count++; if (count >= 20) { break; // Exit when we have 20 primes } } num++; } printf("\n"); return 0; } 5. Search with Early Termination
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define ARRAY_SIZE 100 #define SEARCH_VALUE 42 int main() { // Generate random array int numbers[ARRAY_SIZE]; srand(time(NULL)); printf("Searching for %d in array:\n", SEARCH_VALUE); for (int i = 0; i < ARRAY_SIZE; i++) { numbers[i] = rand() % 100; printf("%3d ", numbers[i]); if ((i + 1) % 20 == 0) printf("\n"); } printf("\n\n"); // Linear search with break int position = -1; for (int i = 0; i < ARRAY_SIZE; i++) { if (numbers[i] == SEARCH_VALUE) { position = i; break; // Found it, no need to continue searching } } if (position != -1) { printf("Found %d at position %d\n", SEARCH_VALUE, position); } else { printf("%d not found in array\n", SEARCH_VALUE); } // Find all occurrences (without break) printf("\nAll occurrences of %d:\n", SEARCH_VALUE); int count = 0; for (int i = 0; i < ARRAY_SIZE; i++) { if (numbers[i] == SEARCH_VALUE) { printf(" Found at index %d\n", i); count++; } } printf("Total occurrences: %d\n", count); return 0; } 6. Data Processing with Skip Logic
#include <stdio.h> #include <ctype.h> #include <string.h> void process_text(const char* text) { int word_count = 0; int char_count = 0; int digit_count = 0; int punctuation_count = 0; printf("Processing text: \"%s\"\n", text); for (int i = 0; text[i] != '\0'; i++) { char c = text[i]; // Skip spaces but count words if (isspace(c)) { if (i > 0 && !isspace(text[i-1])) { word_count++; } continue; // Skip processing spaces further } // Count characters char_count++; // Handle digits if (isdigit(c)) { digit_count++; continue; // Digits counted, skip other checks } // Handle punctuation if (ispunct(c)) { punctuation_count++; continue; // Punctuation counted, skip other checks } // Rest are regular letters // (already counted in char_count) } // Count last word if text doesn't end with space if (char_count > 0 && !isspace(text[strlen(text)-1])) { word_count++; } printf("Results:\n"); printf(" Words: %d\n", word_count); printf(" Characters (excluding spaces): %d\n", char_count); printf(" Digits: %d\n", digit_count); printf(" Punctuation: %d\n", punctuation_count); printf("\n"); } int main() { process_text("Hello, world! 123 test."); process_text("C programming is fun!!!"); process_text("Count 1,2,3 words and 4,5,6 digits"); return 0; } 7. Matrix Operations with Break
#include <stdio.h> #include <stdbool.h> #define ROWS 4 #define COLS 4 void print_matrix(int matrix[ROWS][COLS]) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { printf("%4d", matrix[i][j]); } printf("\n"); } } // Check if matrix is symmetric bool is_symmetric(int matrix[ROWS][COLS]) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < i; j++) { // Only check below diagonal if (matrix[i][j] != matrix[j][i]) { return false; // Found asymmetry, break all loops via return } } } return true; } // Find first occurrence of value void find_value(int matrix[ROWS][COLS], int value) { bool found = false; for (int i = 0; i < ROWS && !found; i++) { for (int j = 0; j < COLS; j++) { if (matrix[i][j] == value) { printf("Found %d at [%d][%d]\n", value, i, j); found = true; break; // Break inner loop } } // Outer loop continues due to !found condition } if (!found) { printf("%d not found in matrix\n", value); } } // Sum positive numbers only int sum_positive(int matrix[ROWS][COLS]) { int sum = 0; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (matrix[i][j] <= 0) { continue; // Skip non-positive numbers } sum += matrix[i][j]; printf(" Adding %d, sum so far: %d\n", matrix[i][j], sum); } } return sum; } int main() { int matrix[ROWS][COLS] = { {1, 2, 3, 4}, {2, 5, 6, 7}, {3, 6, 8, 9}, {4, 7, 9, 10} }; printf("Matrix:\n"); print_matrix(matrix); printf("\n"); printf("Is symmetric? %s\n\n", is_symmetric(matrix) ? "Yes" : "No"); find_value(matrix, 6); find_value(matrix, 99); printf("\n"); printf("Sum of positive numbers:\n"); int total = sum_positive(matrix); printf("Total sum: %d\n", total); return 0; } Advanced Patterns
1. State Machine with Break and Continue
#include <stdio.h> #include <stdbool.h> #include <ctype.h> typedef enum { STATE_START, STATE_IN_WORD, STATE_IN_NUMBER, STATE_IN_QUOTE, STATE_COMMENT } ParserState; void parse_line(const char* line) { ParserState state = STATE_START; printf("Parsing: %s\n", line); printf("Tokens: "); for (int i = 0; line[i] != '\0'; i++) { char c = line[i]; // Handle comments - break out early if (state != STATE_COMMENT && c == '/' && line[i+1] == '/') { state = STATE_COMMENT; printf("\n [comment started]"); continue; } if (state == STATE_COMMENT) { if (c == '\n') { state = STATE_START; } continue; // Skip comment content } switch (state) { case STATE_START: if (isspace(c)) { continue; // Skip whitespace } else if (isdigit(c)) { state = STATE_IN_NUMBER; printf("\n NUMBER: %c", c); } else if (isalpha(c)) { state = STATE_IN_WORD; printf("\n WORD: %c", c); } else if (c == '"') { state = STATE_IN_QUOTE; printf("\n QUOTE: "); } break; case STATE_IN_WORD: if (isalnum(c)) { printf("%c", c); } else { state = STATE_START; i--; // Reprocess this character } break; case STATE_IN_NUMBER: if (isdigit(c)) { printf("%c", c); } else { state = STATE_START; i--; // Reprocess this character } break; case STATE_IN_QUOTE: if (c == '"') { state = STATE_START; } else { printf("%c", c); } break; } } printf("\n\n"); } int main() { parse_line("hello 123 world \"quoted text\""); parse_line("test 456 // this is a comment"); parse_line("alpha beta 789 // comment here"); return 0; } 2. Error Handling with Break
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #define MAX_LINE 256 #define MAX_VALUES 100 typedef struct { int values[MAX_VALUES]; int count; int has_error; char error_msg[256]; } DataResult; DataResult read_numbers_from_file(const char* filename) { DataResult result = {.count = 0, .has_error = 0}; FILE* file = fopen(filename, "r"); if (file == NULL) { result.has_error = 1; snprintf(result.error_msg, sizeof(result.error_msg), "Cannot open file: %s", strerror(errno)); return result; } char line[MAX_LINE]; int line_num = 0; while (fgets(line, sizeof(line), file) != NULL) { line_num++; // Skip empty lines if (line[0] == '\n' || line[0] == '\0') { continue; } // Skip comments if (line[0] == '#') { continue; } // Parse number char* endptr; long val = strtol(line, &endptr, 10); // Check for conversion errors if (errno == ERANGE) { result.has_error = 1; snprintf(result.error_msg, sizeof(result.error_msg), "Number out of range at line %d", line_num); break; // Exit on critical error } if (endptr == line) { // No digits found printf("Warning: No number found at line %d, skipping\n", line_num); continue; // Skip but continue processing } // Check array bounds if (result.count >= MAX_VALUES) { result.has_error = 1; snprintf(result.error_msg, sizeof(result.error_msg), "Too many values, maximum is %d", MAX_VALUES); break; // Exit on critical error } result.values[result.count++] = (int)val; } fclose(file); return result; } int main() { // Create a test file FILE* test = fopen("test.txt", "w"); fprintf(test, "# This is a comment\n"); fprintf(test, "10\n"); fprintf(test, "\n"); // Empty line fprintf(test, "20\n"); fprintf(test, "30\n"); fprintf(test, "abc\n"); // Invalid fprintf(test, "40\n"); fclose(test); DataResult result = read_numbers_from_file("test.txt"); if (result.has_error) { printf("Error: %s\n", result.error_msg); } else { printf("Successfully read %d numbers:\n", result.count); for (int i = 0; i < result.count; i++) { printf("%d ", result.values[i]); } printf("\n"); } return 0; } Common Pitfalls and Best Practices
1. Infinite Loops with Continue
#include <stdio.h> void demonstrate_continue_pitfalls() { printf("=== Continue Pitfalls ===\n\n"); // WRONG - infinite loop printf("WRONG - Infinite loop:\n"); /* int i = 0; while (i < 10) { if (i % 2 == 0) { continue; // i never increments! } printf("%d ", i); i++; } */ // RIGHT - increment before continue printf("RIGHT - Increment before continue:\n"); int i = 0; while (i < 10) { i++; if (i % 2 == 0) { continue; } printf("%d ", i); } printf("\n\n"); // Another approach - increment at end printf("Alternative - increment at end:\n"); i = 0; while (i < 10) { if (i % 2 == 0) { i++; continue; } printf("%d ", i); i++; } printf("\n\n"); } int main() { demonstrate_continue_pitfalls(); return 0; } 2. Break vs Return
#include <stdio.h> int search_array_break(int arr[], int size, int target) { int found_index = -1; for (int i = 0; i < size; i++) { if (arr[i] == target) { found_index = i; break; // Exit loop, but function continues } } // Additional processing if (found_index != -1) { printf("Found at index %d, continuing function...\n", found_index); } return found_index; } int search_array_return(int arr[], int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { printf("Found at index %d, returning immediately\n", i); return i; // Exit function immediately } } printf("Not found\n"); return -1; } int main() { int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); printf("Using break:\n"); int result1 = search_array_break(arr, size, 3); printf("Result: %d\n\n", result1); printf("Using return:\n"); int result2 = search_array_return(arr, size, 3); printf("Result: %d\n", result2); return 0; } 3. Readability Considerations
#include <stdio.h> #include <stdbool.h> // HARD TO READ - too many breaks and continues void process_data_confusing(int data[], int size) { for (int i = 0; i < size; i++) { if (data[i] < 0) continue; if (data[i] > 100) break; if (data[i] % 2 == 0) { printf("%d ", data[i]); if (data[i] == 50) { printf("(special) "); continue; } } if (data[i] % 5 == 0) { printf("*"); } } } // EASIER TO READ - structured approach void process_data_clear(int data[], int size) { for (int i = 0; i < size; i++) { int value = data[i]; // Skip invalid values if (value < 0) { continue; } // Stop if we exceed threshold if (value > 100) { break; } // Process valid values if (value % 2 == 0) { printf("%d ", value); if (value == 50) { printf("(special) "); } } if (value % 5 == 0 && value % 2 != 0) { printf("*"); } } } // EVEN BETTER - extract logic to functions bool is_valid(int value) { return value >= 0 && value <= 100; } bool should_highlight(int value) { return value == 50; } void print_value(int value) { if (value % 2 == 0) { printf("%d ", value); if (should_highlight(value)) { printf("(special) "); } } if (value % 5 == 0 && value % 2 != 0) { printf("*"); } } void process_data_best(int data[], int size) { for (int i = 0; i < size; i++) { int value = data[i]; if (!is_valid(value)) { continue; } print_value(value); } } int main() { int data[] = {-5, 10, 23, 50, 75, 150, 30, 45}; int size = sizeof(data) / sizeof(data[0]); printf("Confusing version:\n"); process_data_confusing(data, size); printf("\n\n"); printf("Clear version:\n"); process_data_clear(data, size); printf("\n\n"); printf("Best version:\n"); process_data_best(data, size); printf("\n"); return 0; } Performance Considerations
#include <stdio.h> #include <time.h> #define ARRAY_SIZE 10000000 #define SEARCH_VALUE 9999999 // Search with break (early termination) int search_with_break(int arr[], int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { return i; // Early return with break } } return -1; } // Search without break (always full scan) int search_without_break(int arr[], int size, int target) { int result = -1; for (int i = 0; i < size; i++) { if (arr[i] == target) { result = i; } } return result; } int main() { static int arr[ARRAY_SIZE]; // Initialize array for (int i = 0; i < ARRAY_SIZE; i++) { arr[i] = i; } clock_t start, end; // Test with break start = clock(); int result1 = search_with_break(arr, ARRAY_SIZE, SEARCH_VALUE); end = clock(); double time1 = ((double)(end - start)) / CLOCKS_PER_SEC; // Test without break start = clock(); int result2 = search_without_break(arr, ARRAY_SIZE, SEARCH_VALUE); end = clock(); double time2 = ((double)(end - start)) / CLOCKS_PER_SEC; printf("Search with break: %f seconds (found at %d)\n", time1, result1); printf("Search without break: %f seconds (found at %d)\n", time2, result2); printf("Break version is %.2f times faster\n", time2 / time1); return 0; } Best Practices Summary
1. When to Use Break:
- Early termination after finding what you need
- Exiting infinite loops
- Handling error conditions
- Menu systems and user interaction
- Breaking out of nested loops (with flags or goto)
2. When to Use Continue:
- Skipping invalid or unwanted data
- Filtering loop iterations
- Avoiding deep nesting of if statements
- Implementing state machines
3. When to Avoid:
- Don't use break when return would be clearer
- Don't use continue when if-else would be clearer
- Avoid excessive breaks/continues that make code hard to follow
- Be careful with continue in while loops (ensure increment happens)
4. Code Organization:
- Use comments to explain why you're breaking/continuing
- Consider extracting complex loop bodies into functions
- Use meaningful variable names for flags
- Keep loops simple and focused
Conclusion
The break and continue statements are essential tools in C programming that provide fine-grained control over loop execution. When used appropriately, they can make code more efficient and readable. However, like all powerful tools, they require judicious use and careful consideration of code clarity.
Key Takeaways:
breakexits the current loop entirelycontinueskips to the next iteration- In nested loops,
breakonly exits the innermost loop - Be careful with
continuein while/do-while loops to avoid infinite loops - Consider alternatives like flags or function extraction for complex scenarios
- Use comments to explain non-obvious control flow decisions
- Profile performance when early termination matters
Mastering break and continue gives you precise control over loop behavior, enabling you to write more efficient and expressive code. Combined with good judgment about readability, these statements become valuable additions to your C programming toolkit.
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/
