微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试用 const 替换 #define 确实有效

如何解决尝试用 const 替换 #define 确实有效

所以我最初使用#define 编写程序,因为我知道它是作为预处理器发生的,但是我的老师评论说我应该使用 const。我尝试在我的代码中替换 #define 但它只是破坏了它,我不知道为什么。我知道 const 可以像变量一样使用,所以我的代码应该只是调用它并且会得到相同的结果不是吗? 这是我的代码工作和不工作的屏幕截图 这是工作:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//Set constant.Preprocessor for speed repace LENGTH
//With what ever number of digits you would want.
#define LENGTH 4

//Converts the input number into an array of digits
int * digitArray(int number) {
    //Creating an array for all digits of the constant length
    static int digits[LENGTH];
    //Loop through the digits and use the mod operator to get each one of them
    for(int i = LENGTH-1; i >= 0; i--) {
        digits[i] = number % 10;
        number = number / 10;
    }
    //Finally,return the array pointer
    return digits;
}

//Compares the correct number array with the guess array of digits,checking for fermi/pica hints and returns
//the number of exact matches of both arrays
int checkGuess(int *num,int *guess) {
    //Create two bool arrays to flag the digits already used
    bool usednum[LENGTH] = {false};
    bool usedGuess[LENGTH] = {false};
    //First loop to check for number of matches
    int matches = 0;
    int used = 0;
    for(int i = 0; i < LENGTH; i++) {
        //Check if the digit is the same for both arrays at i index
        if(num[i] == guess[i]) {
            //If so there is an exact match
            usednum[i] = true;
            usedGuess[i] = true;
            matches++;
            used++;
        }
    }

而且不工作:

const int LENGTH = 4;

//Converts the input number into an array of digits
int * digitArray(int number) {
    //Creating an array for all digits of the constant length
    static int digits[LENGTH];
    //Loop through the digits and use the mod operator to get each one of them
    for(int i = LENGTH-1; i >= 0; i--) {
        digits[i] = number % 10;
        number = number / 10;
    }
    //Finally,int *guess) {
    //Create two bool arrays to flag the digits already used
    bool usednum[LENGTH] = {false};
    bool usedGuess[LENGTH] = {false};
    //First loop to check for number of matches
    int matches = 0;
    int used = 0;
    for(int i = 0; i < LENGTH; i++) {
        //Check if the digit is the same for both arrays at i index
        if(num[i] == guess[i]) {
            //If so there is an exact match
            usednum[i] = true;
            usedGuess[i] = true;
            matches++;
            used++;
        }
    }

我知道这是一些其他问题的重复,但我没有看到任何具体说明为什么它在这种情况下不起作用以及如何修复它以便代码运行的答案。

解决方法

您的第二个代码段没有使用编译时已知的常量值,请注意,const 并不真正意味着常量,而是在 C 中“只读”。

切换自

const int LENGTH = 4;

enum { LENGTH = 4 };  // A real constant

它应该可以工作。

或者您可以保持原样并使用 C99 或 C11 进行编译,那么这些数组将是可变长度数组 (VLA)(请注意,VLA 在 C11 中是可选的)。但是当您事先知道元素的数量时,总是更喜欢第一个选项。

这里:

static int digits[LENGTH];

由于数组总是在循环中填充,因此您不需要 static 关键字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。