因此,我的教授认为,在声明数组的大小时,最好使用#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;
**我希望这是你想要的
答案 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);