定义变量与初始化

Defining a variable vs. initializing

所以,我的教授让我相信,在声明数组大小时,最好使用 #define 而不是将其声明为普通整数。这是正确的吗?

如果是,为什么?

此外,如果这是正确的,我做错了什么?当我尝试这样做时,我收到一条消息:

error: expected ';', ',' or ')' before numeric constant

每次调用数组。如果我只是将它初始化为一个整数,代码就可以工作。

定义和用法见如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define handsize 5
#define size 52

// Create function prototypes
void create_deck (int deck[]);
void shuffle_deck (int size, int deck[]);
void display_card (int card);
void display_hand (int size, int hand[]);
int popCard (int *size, int deck[]);
int findScore (int size, int hand[]);

int main()
{
    // declare/ initialize variables
    int c, d, p, win = 0, lose = 0 , tie = 0, /*handsize = 0, size = 52,*/ deck[size], hand[handsize], dealer[handsize];
    char play;
    srand(time(NULL));      // attach random number generator to time function for truly random variables

    // explain program to user and ask if they want to play
    printf("This program is a card game that adds the values of all the\n");
    printf("cards in the players hand, and the computers hand. The highest hand wins.\n");
    printf("Would you like to play? Please press 'y' for yes, any other key for no.\n");
    scanf("%c", &play);     // if the user wants to play, continue the program

    // while loop that continues as long as the user wants to play
    while (play == 'y'){

        // call functions to create and shuffle the deck
        create_deck(deck);
        shuffle_deck (size, deck);

        // for loop that calls the popCard function to deal the top card in the deck
        for (c = 0; c < 5; c++){
            hand[c] = popCard (&size, deck);        // player gets a card
            dealer[c] = popCard (&size, deck);      // computer gets a card
            handsize++;
            // call the display_hand function to display the individual cards in the players hand
            printf("\nYour hand consists of:\n");
            display_hand (handsize, hand);
            // call the display_hand function to display the individual cards in the dealers hand
            printf("Dealer hand consists of:\n");
            display_hand (handsize, dealer);
        }

        // call the findScore function for both the user and the computer
        p = findScore (handsize, hand);
        d = findScore (handsize, dealer);

        // show the value of the user and computers hands
        printf("\nThe value of your hand is %i\n", p);
        printf("\nThe value of the dealers hand is %i\n", d);

        // if statements that keep track of wins, losses and ties
        if (p > d)
            win++;
        if (p == d)
            tie++;
        if (p < d)
            lose++;

        // show number of times player has won, lost, tied.  Then ask to play again
        printf("You have won %i times, tied %i times, and lost %i times\n", win, tie, lose);
        printf("\nWould you like to play again?\n");
        fflush(stdin);      // flush the input buffer to stop false readings
        scanf("%c", &play); // read the user input to determine if they want to play again
    }
    printf("Goodbye");
    return 0;

**希望这就是你想要的

通常首选符号常量(#define 或实际常量)。

例如,如果您的代码中充斥着值 1440,但您将该数字用于每英寸缇数和每张软盘千字节数(这很能说明我的年龄),会发生什么情况?

然后你的软盘一下子变成了2.88M。然后你必须通过 all 你的代码寻找 1440 并弄清楚它是否意味着缇或千字节版本,并更改​​相关的。所以你不仅要在多个地方进行更改(够糟糕),你可能还必须弄清楚你是否在每个地方进行了更改。

你有没有完成:

#define TWIPS_PER_INCH 1440
#define KB_PER_FLOPPY  1440

然后在你的代码中加入符号名称,你可以只更改 一行 行,而不需要太多思考或分析。


有一种思想流派认为,除零或一以外的任何数字(也可能是负数)都应该具有某种符号常数。只要确保你没有犯这样的错误:

#define FOURTEEN_HUNDRED_AND_FORTY 1440

就像我的一个仆从曾经尝试过一样。我在试图解释为什么 that 是个坏主意时获得了无尽的乐趣 :-)


至于你的错误,当然可以声明一个带有预处理器常量的数组,如下所示:

#include <stdio.h>
#include <string.h>

#define VAR 42
int main (void) {
    char xyzzy[VAR];
    strcpy (xyzzy, "pax is awesome");
    puts (xyzzy);
    return 0;
}

但是,请考虑代码中的以下几行:

#define size 52
void shuffle_deck (int size, int deck[]);
void display_hand (int size, int hand[]);
int popCard (int *size, int deck[]);
int findScore (int size, int hand[]);
hand[c] = popCard (&size, deck);
// and possibly many others.

因为预处理是在编译过程的早期进行的文本替换,所以第一行之后的行将变为:

void shuffle_deck (int 52, int deck[]);
void display_hand (int 52, int hand[]);
int popCard (int *52, int deck[]);
int findScore (int 52, int hand[]);
hand[c] = popCard (&52, deck);

它们会导致各种各样的问题,其中 52 不是函数原型中的有效变量名,并且你不能在 C 中获取整型文字的地址,因为它 没有地址。

为了解决这个问题,您将初始大小定义为常量:

#define INIT_SZ 52

并使用它来设置 变量的初始值 size ,您可以稍后更改它,例如:

void doSomethingThatChangesSize (int *pSize) {
    (*pSize) += 42;
}

int size = INIT_SZ; // this is the only way you use INIT_SZ
:
doSomethingThatChanges (&size);