定义变量与初始化

时间:2015-02-20 03:59:49

标签: c arrays variables c-preprocessor

因此,我的教授认为,在声明数组的大小时,最好使用#define而不是将其声明为普通整数。这是对的吗?

如果是这样,为什么?

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

  

错误:在数字常量

之前预期';',','或')'

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

定义和用法可在以下代码中看到:

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

**我希望这是你想要的

1 个答案:

答案 0 :(得分:1)

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

会发生什么情况,例如,当您的代码中添加了值1440,但是您使用该数字表示每英寸缇和每个软盘的千字节数(非常显示我的年龄)?

然后你的软盘突然变成了2.88M。然后,您必须通过所有代码查找1440,并确定它是否意味着twips或kilobytes版本,并更改​​相关的代码。因此,您不仅需要在多个地方进行更改(足够糟糕),您还可能需要确定是否在每个地点进行更改。

如果你这样做了:

#define TWIPS_PER_INCH 1440
#define KB_PER_FLOPPY  1440

然后使用符号名称填充您的代码,然后您可以更改一个行,而无需过多的思考或分析。


有一种观点认为,除了零或一个(可能是负数)之外的任何数字都应该具有某种符号常数。只要确保你没有犯错:

#define FOURTEEN_HUNDRED_AND_FORTY 1440
就像我曾经尝试过的一个仆从一样。我试图解释为什么 是一个坏主意,我有无尽的乐趣: - )


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

#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);