In C, all subprograms are functions. Recall that C does distinguish between assignment statements and subroutine calls as Fortran does. Any expression followed by a semicolon is a valid statement in C.
Following the minimalist philosophy, C also has no intrinsic (built-in) functions. Commonly used functions such as sin(), sqrt(), etc. are provided by libraries, archives of functions written in C (or any other compiled language).
The basic syntax of a C function definition is as follows:
return-type function-name(argument variable definitions) { local variable definitions body return [value]; }
The return type can be any basic data type described in Table 17.1, “C Data Types” or a pointer (discussed in Chapter 23, Memory Addresses and Pointers).
It is also possible to define a function that does not return a value
by giving it a return type of void
. However, most C
functions do return a value of some sort. Functions that do not
compute a result such as a square root generally return a status
value to indicate whether the function completed successfully.
Since any expression followed by a semicolon is a valid statement in C, it is acceptable (although not a good idea) to ignore the return value of some functions.
For example, the library function printf() returns the number of characters printed, or a negative value if an error occurred. We often ignore the return value:
printf("The square of %f is %f\n", n, n * n);
However, errors can occur on output due to a disk being full or a network connection being lost, so it's a good idea to check:
if ( printf("The square of %f is %f\n", n, n * n); < 0 ) { // printf() failed. Handle the error as gracefully as possible. }
The scanf() function returns the number of input items successfully read. It is important to check for success, since input errors are common.
if ( scanf("%d %d", &rows, &cols) != 2 ) { // scanf() failed. Handle the error as gracefully as possible. }
Below is a sample C program showing a definition of a power() function. In addition to the function definition, the program contains a prototype for the function above main(), which is explained in the section called “Type Matching”.
/*************************************************************************** * Description: * Program to print a table of integer powers * * Arguments: * None. * * Returns: * See sysexits.h * * History: * Date Name Modification * 2013-08-12 Jason Bacon Begin ***************************************************************************/ #include <stdio.h> #include <sysexits.h> // Prototypes double power(double base, int exponent); int main(int argc,char *argv[]) { // Variable definitions int exponent; // Statements puts("Powers of 2"); for (exponent = 0; exponent <= 10; ++exponent) // Will not work with 2.0 instead of 2.0d0 printf("2 ^ %d = %f\n", exponent, power(2.0, exponent)); puts("Powers of 3"); for (exponent = 0; exponent <= 10; ++exponent) // Will not work with 3.0 instead of 3.0d0 printf("3 ^ %d = %f\n", exponent, power(3.0, exponent)); return EX_OK; } /*************************************************************************** * Description: * Compute base ** exponent for any non-negative integer exponent * * Arguments: * base: The real base of base ** exponent * exponment: The non-negative integer exponent * * Returns: * base ** exponent * * History: * Date Name Modification * 2013-08-12 Jason Bacon Begin ***************************************************************************/ double power(double base, int exponent) { // Local variables double p; // Compute n! p = 1.0; while ( exponent-- >= 1 ) p *= base; return p; }