定义变量与初始化
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);
所以,我的教授让我相信,在声明数组大小时,最好使用 #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);