C Library User 手册(7)
7 Functions
你写函数是为了指定一个程序执行时的所有动作。一个函数的类型告诉你它返回的结果的类型(如果有的话)。它还可以告诉你当你从表达式中调用该函数时,该函数所期望的任何参数的类型。
本章只简要介绍了与使用标准C语言库最相关的函数的那些方面:
7.1 Argument promotion
当函数的类型未能提供任何关于参数的信息时,就会发生参数推广。如果函数声明不是一个函数原型,或者如果参数是不同数量的参数中的一个未命名的参数,就会发生推广。在这种情况下,参数必须是一个r值表达式。因此。
■ 一个整数类型的参数被提升。
■ 一个Ty的数组类型的lvalue变成一个Ty的指针类型的rvalue。
■一个返回Ty的函数类型的函数代号成为返回Ty的函数的指针类型的r值。
■一个float类型的参数被转换为double。
7.2 Expressions
在测试上下文表达式中,如果计算值为非零,表达式的值会导致控制在语句中以一种方式流动,如果计算值为零则以另一种方式流动。你只能写一个有标量r值结果的表达式,因为只有标量可以与零进行比较。
出现在副作用上下文中的表达式不指定任何值,也不指定任何对象或函数。因此,它可以有void类型。你通常评估这样的表达式的副作用–在评估表达式时发生的程序状态的任何变化。当程序将一个值存储在一个对象中,从一个易失性限定类型的对象中访问一个值,或者改变一个文件的状态时,就会产生副作用。
7.3 Statements
一个do语句执行一个或多个语句,而它的测试上下文表达式有一个非零值。
do
statement while (test);
表达式语句在副作用的背景下评估一个表达式:
printf("hello\n");
y = m * x + b;
++count;
call a function
store a value
alter a stored value
while语句执行一个语句零次或多次,同时测试背景表达式有一个非零值:
while (test) statement
for 语句执行一个语句零次或多次,而可选的测试上下文表达式 test 有一个非零值。你也可以在for语句中写两个表达式,se-1和se-2,它们分别在一个副作用上下文中。
for (se-1; test; se-2) statement
只有当测试上下文表达式的值为非零时,if语句才会执行一条语句:
if (test) statement
一个if-else语句执行两条语句中的一条,取决于测试上下文表达式是否有一个非零值:
if (test) statement-1
else statement-2
返回语句终止了函数的执行,并将控制权转移到调用该函数的表达式。如果你在返回语句中写了可选的rvalue表达式,其结果必须与函数返回的类型赋值兼容。程序将表达式的值转换为返回的类型,并将其作为函数调用的值返回:
return expression;
switch语句根据整数表达式的值,跳转到受控语句中的某个位置:
switch (expr) {
case val-1:
stat-1;
break; case val-2:
stat-2; default:
stat-n
falls through to next
}