[C/C++]C函数

本文介绍了C语言中的按值调用与按引用调用的区别及其应用场景,并通过一个双骰子赌博游戏实例加深理解。此外,还详细解释了C语言中的四种存储类型(auto, register, extern, static)及其作用域、存储周期的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主调函数:按值调用与按引用调用

按值调用(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值