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;
}