Function: What Is A Function?
Function: What Is A Function?
Function: What Is A Function?
What is a Function? A function is a self-contained block of statements that perform a coherent task of some kind. Every C program can be thought of as a collection of these functions. Any C program contains at least one function. If a program contains only one function, it must be main( ). If a C program contains more than one function, then one (and only one) of these functions must be main( ), because program execution always begins with main( ). There is no limit on the number of functions that might be present in a C program. Each function in a program is called in the sequence specified by the function calls in main( ). After each function has done its thing, control returns to main( ).When main( ) runs out of function calls, the program ends. C program is a collection of one or more functions. A function gets called when the function name is followed by a semicolon. A function is defined when function name is followed by a pair of braces in which one or more statements may be present. Any function can be called from any other function. Even main( ) can be called from other functions. A function can be called any number of times. The order in which the functions are defined in a program and the order in which they get called need not necessarily be same. A function can call itself. Such a process is called recursion. A function can be called from other function, but a function cannot be defined in another function. There are basically two types of functions: Library functions Ex. printf( ), scanf( ) etc. and User-defined functions Ex. argentina( ), brazil( ) etc. By default the scope of a variable is local to the function in which it is defined. All identifiers in C need to be declared before they are used. This is true for functions as well as variables. For functions the declaration needs to be before the first call of the function. A full declaration includes the return type and the number and type of the arguments. This is also called the function prototype. The function definition itself can act as an implicit function declaration. This was used in the above example and was why sum was put before main. If the order was reversed the compiler would not recognize sum as a function. To correct this a prototype could be added before main: Example 6-3. A simple program with a function prototype
/* A simple example of a function prototype allowing the function to be used before it is defined. */ #include <stdio.h>
int sum (int, int); int main (void) { int total; total = sum (2, 3); printf ("Total is %d\n", total); return 0; } int sum (int a, int b) { return a + b; } Why Use Functions: Avoids rewriting the same code over and over again. Using functions it becomes easier to write programs and keep track of what they are doing. Passing Values between Functions: There are two ways to pass parameters to a function:
Pass by Value: mechanism is used when you don't want to change the value of passed paramters. When parameters are passed by value then functions in C create copies of the passed in variables and do required processing on these copied variables. Pass by Reference mechanism is used when you want a function to do the changes in passed parameters and reflect those changes back to the calling function. In this case only addresses of the variables are passed to a function so that function can work directly over the addresses. & used in statement is Cs address of operator. The other pointer operator available in C is *, called value at address operator. It gives the value stored at a particular address. The value at address operator is also called indirection operator.
Here are two programs to understand the difference: First example is for Pass by value:
#include <stdio.h>
printf("Before: Value of a = %d and value of b = %d\n", a, b ); swap( a, b ); printf("After: Value of a = %d and value of b = %d\n", a, b ); }
t = p2; p2 = p1; p1 = t; printf("Value of a (p1) = %d and value of b(p2) = %d\n", p1, p2 ); } Here is the result produced by the above example. Here the values of a and b remain unchanged before calling swap function and after calling swap function. Before: Value of a = 10 and value of b = 20 Value of a (p1) = 20 and value of b(p2) = 10 After: Value of a = 10 and value of b = 20 Following is the example which demonstrate the concept of pass by reference #include <stdio.h>
/* function declaration goes here.*/ void swap( int *p1, int *p2 );
printf("Before: Value of a = %d and value of b = %d\n", a, b ); swap( &a, &b ); printf("After: Value of a = %d and value of b = %d\n", a, b ); }
t = *p2; *p2 = *p1; *p1 = t; printf("Value of a (p1) = %d and value of b(p2) = %d\n", *p1, *p2 ); } Here is the result produced by the above example. Here the values of a and b are changes after calling swap function. Before: Value of a = 10 and value of b = 20 Value of a (p1) = 20 and value of b(p2) = 10 After: Value of a = 20 and value of b = 10
However, we want to return the value, it is necessary to use the return statement. The return statement serves two purposes: (1) On executing the return statement it immediately transfers the control back to the calling program. (2) It returns the value present in the parentheses after return, to the calling program. Calling Convention Calling convention indicates the order in which arguments are passed to a function when a function call is encountered. Arguments might be passed from right to left in C. For example: int a = 1 ; printf ( "%d %d %d", a, ++a, a++ ) ; Surprisingly, it outputs 3 3 1. This is because Cs calling convention is from right to left. That is, firstly1 is passed through the expression a++ and then a is incremented to 2. Then result of ++a is passed. That is, a is incremented to 3 and then passed. Finally, latest value of a, i.e. 3, is passed. Thus in right to left order 1, 3, 3 get passed. Once printf( ) collects them it prints them in the order in which we have asked it to get them printed (and not the order in which they were passed). Thus 3 3 1 gets printed. Note: If we want that the value of an actual argument should not get changed in the function being called, pass the actual argument by value. If we want that the value of an actual argument should get changed in the function being called, pass the actual argument by reference. If a function is to be made to return more than one value at a time then return these values indirectly by using a call by reference. Recursion A function is called recursive if a statement within the body of a function calls the same function. Sometimes called circular definition, recursion is thus the process of defining something in terms of itself. main( ) { int a, fact ; printf ( "\nEnter any number " ) ; scanf ( "%d", &a ) ; fact = rec ( a ) ; printf ( "Factorial value = %d", fact ) ; } rec ( int x ) { int f ; if ( x == 1 ) return ( 1 ) ; else f = x * rec ( x - 1 ) ; return ( f ) ;
} Adding Functions to the Library: Add the function to the library by issuing the command C:\>tlib math.lib + c:\fact.obj Here, math.lib is a library filename, + is a switch, which means we want to add new function to library and c:\fact.obj is the path of the .obj file. To use the function present inside the library, create a program as shown below: #include "c:\\fact.h" If we wish we can delete the existing functions present in the library using the minus ( - ) switch.
Command-line arguments The C language provides a method to pass parameters to the main() function. This is typically accomplished by specifying arguments on the operating system command line (console). The prototype for main() looks like: int main(int argc, char *argv[]) { } There are two parameters passed to main(). The first parameter is the number of items on the command line (int argc). Each argument on the command line is separated by one or more spaces, and the operating system places each argument directly into its own null-terminated string. The second parameter passed to main() is an array of pointers to the character strings containing each argument (char *argv[]). For example, at the command prompt: test_prog 1 apple orange 4096.0 There are 5 items on the command line, so the operating system will set argc=5 . The parameter argv is a pointer to an array of pointers to strings of characters, such that: argv[0] is a pointer to the string test_prog argv[1] is a pointer to the string 1 argv[2] is a pointer to the string apple argv[3] is a pointer to the string orange and argv[4] is a pointer to the string 4096.0 Notes The main() routine can check argc to see how many arguments the user specified. The minimum count for argc is 1: the command line just contained the name of the invoked program with no arguments. The program can find out its own name as it was invoked: it is stored in the argv[0] string! Some operating systems don't provide this feature, however. The arguments from the command line are not automatically converted: the characters are just copied into the argv strings. If an argument on the command line is to be interpreted as a numerical constant, such as argv[1] and argv[4] in this example, it can be converted using a string conversion. int int_val; float float_val;
sscanf(argv[1],%d,&int_val); sscanf(argv[4],%f,&float_val); and printf(The 3rd and 4th items on the command line are %s and %s\n, argv[2], argv[3]); results in: The 3rd and 4th items on the command line are apple and orange The string functions atoi(), atol(), atof(), etc., will also work.