何时在C的函数中使用常量

何时在C的函数中使用常量,c,C,我一直在准备明天的期中考试,我遇到了一个问题,我无法在答案2和答案3之间做出决定PlayingCard是一个struct,HANDSIZE是一个值为5的常量 正确的答案显然是选项2,但我和一位朋友都认为更好的选择是3,因为我们被告知,当我们知道变量不会改变时,我们应该使用const作为良好的编程实践。既然在这里没有改变,为什么选项2比选项3更好 /* QUESTION: What should go for the definition of isFlush that detects flush

我一直在准备明天的期中考试,我遇到了一个问题,我无法在答案2和答案3之间做出决定
PlayingCard
是一个
struct
HANDSIZE
是一个值为5的常量

正确的答案显然是选项2,但我和一位朋友都认为更好的选择是3,因为我们被告知,当我们知道变量不会改变时,我们应该使用const作为良好的编程实践。既然在这里没有改变,为什么选项2比选项3更好

/* QUESTION: What should go for the definition of isFlush that detects flushes
   1: Nothing
   2: bool isFlush(PlayingCard hand[HANDSIZE]) {
   3: bool isFlush(const PlayingCard hand[HANDSIZE]) {
   4: bool isFlush(PlayingCard ** hand) {
   5: bool isFlush(const PlayingCard ** hand) {
   6: bool isFlush(PlayingCard *** hand) {
   7: bool isFlush(CardFace * hand) {
   8: bool isFlush(CardSuit * hand) {
   9: bool isFlush(CardSuit suits[HANDSIZE]) {
*/
// missing function defintion
    CardSuit suit = hand[0].suit;
    for (int i = 1;  i < HANDSIZE; i++ ) {
        if (suit != hand[i].suit) {
            return false;
        }
    }
    return true;
}
/*问题:检测刷新的isFlush的定义应该是什么
1:没什么
2:bool isFlush(玩手牌[手牌]){
3:bool isFlush(const PlayingCard hand[手持]){
4:bool isFlush(玩牌**手){
5:bool isFlush(持续播放卡片**手){
6:bool isFlush(玩牌***手){
7:bool isFlush(卡片面*手){
8:bool isFlush(CardSuit*手动){
9:bool isFlush(CardSuit套装[手型]){
*/
//缺失函数定义
CardSuit suit=手[0]。西装;
对于(int i=1;i
您可以使用
const
作为函数不会修改某些内容的提示。您可以将指向非
const
对象的指针传递给声明它将使用指向
const
对象的指针的函数

我们没有足够的信息告诉您哪个函数声明有效。我可以取消选项1、4、5、6、8和9

我可以删除选项1,因为它不会编译

我可以取消选项4、5和6,因为您不能像在初始化
suit
时那样使用
操作符访问指针

我可以取消选项8,因为不能使用
!=
比较
结构
联合

我可以删除选项9,因为参数的名称是错误的

选项8和9也不太可能,因为在初始化
suit
时建议对类型
CardSuit
进行递归定义

你问:

既然在这里没有改变,为什么选项2比选项3更好

您似乎已经取消了选项7。我没有足够的信息来这样做,因为
PlayingCard
可能没有
suit
会员,而
CardFace
可能有这样的会员。如果是这样的话,正确的答案是选项7

但是假设选项7应该被删除,那么选项2或3将对函数起作用。因此,特别要回答您上面的问题,选项3更优越,因为它传达了函数不会修改数组元素的意图

与选项3相比,选项2的唯一优势在于,它将排除使用
const
事物数组调用函数的尝试。只有当函数希望修改元素时,才需要这样做

正如我们被告知的,我们应该使用
const
作为良好的编程实践 当我们知道变量不会改变时

这是真的,但只有当你传递一个指向变量的指针时,如果你按值传递变量,我看不出有什么好处


在这种情况下,我同意最好的答案是3。要问问题的作者为什么正确答案是2可能太晚了。

@Code学徒:怎么会这样?没有cout,而且CardSuit可能是typedef。我同意你和你的朋友的看法。在函数de中指定数组元素的数量编译期间将被丢弃且不会更改函数签名的声明具有误导性。这没有错,但也不…正确。在初学者课程中,它会让人们认为他们通过了数组,但他们不会。它是一种documentation@Edenia我看不出
/*指针应该如何指向至少由5个元素组成的数组的第一个元素*/void f(int*p);
void f(int p[5])要好;
当然,最好尽可能指定所有常量,只要是为了表达意图。但它也可以防止出现错误。