主调函数:按值调用与按引用调用
按值调用(Call-by-value):当实参采用按值调用时,程序会为实参的变量值创建一个副本,并把副本传递给被调函数。被掉函数中对这个副本的修改不会影响到实参对应的变量的原始值。
按引用调用(Call-by-reference):当实参采用按引用调用时,主调函数则允许被调函数对实参对应的变量的值进行修改。
如果被调函数不需要修改主函数中变量的值,那么我们就采用按值调用。只有在确信需要被调用函数修改主函数中变量的值的时候,才使用按引用调用。
双骰子赌博 游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum Status {CONTINUE, WON, LOST};
int rollDice(void);
int main(void)
{
int sum;
int myPoint;
enum Status gameStatus;
srand(time(NULL));
sum = rollDice();
switch (sum)
{
case 7:
case 11:
gameStatus = WON;
break;
case 2:
case 3:
case 12:
gameStatus = LOST;
break;
default:
gameStatus = CONTINUE;
myPoint = sum;
printf("Point is %d\n", myPoint);
break;
}
while (gameStatus == CONTINUE)
{
sum = rollDice();
if (sum == myPoint)
{
gameStatus = WON;
}
else
{
if (sum == 7)
{
gameStatus = LOST;
}
}
} // end while
if (gameStatus == WON)
{
printf("Player wins\n");
}
else {
printf("Player loses\n");
}
while (true) // pause
{
}
return 0;
}
int rollDice(void)
{
int die1;
int die2;
int workSum;
die1 = 1 + (rand() % 6);
die2 = 1 + (rand() % 6);
workSum = die1 + die2;
return workSum;
}
储存类型
C语言的标识符有很多属性,例如:储存类型(Storage class)、储存周期(Storage duration)、作用域(Scope)和链接(Linkage)等。
C语言共有四种储存类型,他们对应的储存类型说明符分别是:auto, register, extern和static。
C语言的四种储存类型可以按照其对应的储存周期,分为两类:自动储存周期和静态储存周期。
关键字auto和register用于声明对应于自动储存周期的变量,只有变量可以具有自动储存周期。
关键字extern和static用于声明对应于静态储存周期的变量名和函数名的标识符。静态储存周期的标识符从程序运行的开始时刻就有效。程序运行时进行分配和初始化的,而且只分配和初始化一次。
具有静态储存周期的标识符分为两类:外部标识符(例如全局变量和函数名)和用static声明的局部变量。全局变量在程序运行期间始终存在。
通常情况下,不要使用全局变量
标识符作用域的规定
一个标识符的作用域表示这个标识符能够在程序中被访问到的区域。C语言有四种作用域:函数作用域(Function Scope)、文件作用域(File Scope)、程序块作用域(Block scope)和函数原型作用域(Function-prototype scope)
标号(即后面跟着冒号的标识符) switch 和 goto语句
文件作用域 全局变量、函数定义和位于函数外的函数原型都具有文件作用域
程序块作用域 程序块内部定义的标识符 局部变量和函数形参
数据类型的提升层次结构
数据类型 | printf函数的转换说明 | scanf函数的转换说明 |
---|---|---|
长双精度浮点数据 | %Lf | %Lf |
双精度浮点数 | %f | %lf |
浮点数 | %f | %f |
无符号长整数 | %lu | %lu |
长整数 | %ld | %ld |
无符号整数 | %u | %u |
整数 | %d | %d |
无符号短整数 | %hu | %hu |
短整数 | %hd | %hd |
字符数据 | %c | %c |