C Return Statement

What is the Return Statement?

The return statement in C terminates the execution of a function and sends a value back to the calling function. It also exits the current function immediately.

Two Main Purposes

PurposeDescription
Exit the functionStops execution at that point, no further code runs
Return a valueSends a result back to where the function was called

Basic Syntax

return;           // For void functions (no value)
return value;     // Returns a specific value
return expression; // Returns result of expression

Example 1: Return in Void Functions

#include <stdio.h>
// Void function with no return value
void greet() {
printf("Hello!\n");
return;  // Optional, exits function
printf("This line never executes!\n");
}
int main() {
greet();
printf("Back in main\n");
return 0;
}

Output:

Hello!
Back in main

Example 2: Return Values from Functions

#include <stdio.h>
// Returns an integer value
int add(int a, int b) {
int result = a + b;
return result;  // Returns value to caller
}
// Returns result of expression directly
int multiply(int a, int b) {
return a * b;   // Shorter version
}
int main() {
int sum = add(5, 3);        // sum = 8
int product = multiply(4, 2); // product = 8
printf("Sum: %d\n", sum);
printf("Product: %d\n", product);
// Can use return value directly in printf
printf("Direct: %d\n", add(10, 20));
return 0;
}

Output:

Sum: 8
Product: 8
Direct: 30

Example 3: Early Return (Exiting Early)

#include <stdio.h>
// Check if number is positive
int checkPositive(int num) {
if(num <= 0) {
return 0;  // Exit early - not positive
}
// This code runs only if num > 0
printf("Processing positive number: %d\n", num);
return 1;  // Positive
}
int main() {
checkPositive(-5);   // Exits early at return 0
checkPositive(10);   // Runs full function
return 0;
}

Output:

Processing positive number: 10

Example 4: Return Multiple Types

#include <stdio.h>
// Return char
char getGrade(int score) {
if(score >= 90) return 'A';
if(score >= 80) return 'B';
if(score >= 70) return 'C';
return 'F';
}
// Return float
float calculateAverage(int a, int b, int c) {
return (a + b + c) / 3.0;
}
// Return pointer (string)
char* getStatus(int score) {
if(score >= 60) return "Pass";
return "Fail";
}
int main() {
printf("Grade: %c\n", getGrade(85));
printf("Average: %.2f\n", calculateAverage(10, 20, 30));
printf("Status: %s\n", getStatus(75));
return 0;
}

Output:

Grade: B
Average: 20.00
Status: Pass

Example 5: Return in Different Function Types

#include <stdio.h>
// int return type
int getMax(int x, int y) {
if(x > y) return x;
return y;
}
// float return type
float getPi() {
return 3.14159;
}
// double return type
double calculateArea(double radius) {
return 3.14159 * radius * radius;
}
// char array return (pointer to string)
char* getMessage() {
return "Hello from function!";
}
int main() {
printf("Max: %d\n", getMax(15, 8));
printf("Pi: %.5f\n", getPi());
printf("Area: %.2f\n", calculateArea(5.0));
printf("Message: %s\n", getMessage());
return 0;
}

Example 6: Return with Complex Logic

#include <stdio.h>
#include <string.h>
// Find first vowel in a string
char findFirstVowel(char str[]) {
for(int i = 0; str[i] != '\0'; i++) {
char c = str[i];
if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
return c;  // Return first vowel found
}
}
return '\0';  // No vowel found, return null character
}
// Factorial using recursion (returns result)
int factorial(int n) {
if(n <= 1) return 1;      // Base case
return n * factorial(n - 1); // Recursive case
}
// Validate age with multiple returns
int validateAge(int age) {
if(age < 0) return -1;    // Invalid: negative
if(age > 150) return -2;  // Invalid: too old
return 1;                  // Valid
}
int main() {
char vowel = findFirstVowel("hello");
if(vowel != '\0') {
printf("First vowel: %c\n", vowel);
}
printf("Factorial of 5: %d\n", factorial(5));
int result = validateAge(25);
if(result == 1) {
printf("Age is valid\n");
} else {
printf("Invalid age\n");
}
return 0;
}

Output:

First vowel: e
Factorial of 5: 120
Age is valid

Example 7: Return with Arrays (Using Pointers)

#include <stdio.h>
// Return pointer to array (be careful with local arrays!)
int* getEvens() {
static int evens[] = {2, 4, 6, 8, 10};  // Static to persist after return
return evens;
}
// Return sum of array elements
int sumArray(int arr[], int size) {
int sum = 0;
for(int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int main() {
// Access returned array
int *evens = getEvens();
printf("First even: %d\n", evens[0]);
int numbers[] = {1, 2, 3, 4, 5};
int total = sumArray(numbers, 5);
printf("Sum: %d\n", total);
return 0;
}

Important Rules

RuleExplanationExample
Return type must matchFunction return type and returned value must matchint func() → can't return 3.14
Void functionsCan use return; (no value) or omit itvoid func() { return; }
Non-void functionsMust return a value (except main() can omit)int func() { return 0; }
Stops executionCode after return never runsreturn; printf("No");
Single return per callOnly one return executes per function callMultiple conditional returns possible

Common Mistakes

// MISTAKE 1: Wrong return type
int getValue() {
return 3.14;  // Warning! Double to int conversion
}
// MISTAKE 2: Missing return in non-void function
int isPositive(int x) {
if(x > 0) {
return 1;
}
// Error: No return if x <= 0
}
// CORRECT:
int isPositive(int x) {
if(x > 0) return 1;
return 0;  // Always return something
}
// MISTAKE 3: Returning local array address
int* getArray() {
int arr[] = {1, 2, 3};  // Local array
return arr;  // BUG! arr destroyed after return
}
// CORRECT: Use static or malloc
int* getArray() {
static int arr[] = {1, 2, 3};
return arr;  // OK - static persists
}

Return in main() Function

#include <stdio.h>
#include <stdlib.h>
int main() {
int result = 0;
// Return values in main indicate program status
// 0 = success, non-zero = error
if(some_error_occurred) {
return 1;  // Error code 1
}
return 0;  // Success
}
// You can check return value in shell:
// $ ./program
// $ echo $?  (shows 0 if success)

Return vs Break vs Exit

StatementScopeEffect
returnCurrent functionExits function, returns to caller
breakLoop or switchExits loop/switch only
exit()Entire programTerminates whole program
#include <stdio.h>
#include <stdlib.h>
void testBreak() {
for(int i = 1; i <= 5; i++) {
if(i == 3) break;      // Exits loop only
printf("%d ", i);       // Prints: 1 2
}
printf(" - After loop\n");  // This runs
}
void testReturn() {
for(int i = 1; i <= 5; i++) {
if(i == 3) return;      // Exits function completely
printf("%d ", i);       // Prints: 1 2
}
printf("This never runs\n"); // Never runs
}
void testExit() {
for(int i = 1; i <= 5; i++) {
if(i == 3) exit(0);      // Exits entire program
printf("%d ", i);        // Prints: 1 2
}
}
int main() {
printf("Break: ");
testBreak();
printf("\nReturn: ");
testReturn();
printf("\nExit: ");
testExit();  // Program ends here
printf("This never prints\n");
return 0;
}

Quick Reference Table

Function TypeReturn StatementExample
voidreturn; or just }void greet() { printf("Hi"); }
intreturn value;int add(int a, int b) { return a+b; }
float/doublereturn value;double pi() { return 3.14; }
charreturn 'char';char getFirst() { return 'A'; }
pointerreturn &variable;char* getName() { return "John"; }
structreturn struct_var;Point getOrigin() { return p; }

Summary

  • return → Exits function and optionally sends back a value
  • Type must match between function declaration and returned value
  • Early return is useful for validation and error checking
  • Only one return executes per function call (though multiple conditional returns are fine)
  • main() return 0 indicates successful program execution
  • Void functions can have empty return; or none at all

Complete Guide to Core & Advanced C Programming Concepts (Functions, Strings, Arrays, Loops, I/O, Control Flow)

https://macronepal.com/bash/building-blocks-of-c-a-complete-guide-to-functions/
Explains how functions in C work as reusable blocks of code, including declaration, definition, parameters, return values, and modular programming structure.

https://macronepal.com/bash/the-heart-of-text-processing-a-complete-guide-to-strings-in-c-2/
Explains how strings are handled in C using character arrays, string manipulation techniques, and common library functions for text processing.

https://macronepal.com/bash/the-cornerstone-of-data-organization-a-complete-guide-to-arrays-in-c/
Explains arrays in C as structured memory storage for multiple values, including indexing, initialization, and efficient data organization.

https://macronepal.com/bash/guaranteed-execution-a-complete-guide-to-the-do-while-loop-in-c/
Explains the do-while loop in C, where the loop body executes at least once before checking the condition.

https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-the-for-loop-in-c/
Explains the for loop in C, including initialization, condition checking, and increment/decrement for controlled iteration.

https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-while-loops-in-c/
Explains the while loop in C, focusing on condition-based repetition and proper loop control mechanisms.

https://macronepal.com/bash/beyond-if-else-a-complete-guide-to-switch-case-in-c/
Explains switch-case statements in C, enabling multi-branch decision-making based on variable values.

https://macronepal.com/bash/mastering-conditional-logic-a-complete-guide-to-if-else-statements-in-c/
Explains if-else statements in C for decision-making and controlling program flow based on conditions.

https://macronepal.com/bash/mastering-the-fundamentals-a-complete-guide-to-arithmetic-operations-in-c/
Explains arithmetic operations in C such as addition, subtraction, multiplication, division, and operator precedence.

https://macronepal.com/bash/foundation-of-c-programming-a-complete-guide-to-basic-input-output/
Explains basic input and output in C using scanf and printf for interacting with users and displaying results.

Online C Code Compiler
https://macronepal.com/free-online-c-code-compiler-2/

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper