return将枚举作为 char 实际上并不 return 该枚举的值

returning enum as char doesn't actually return the value of that enum

我有一个枚举:

enum asm_adressing_types{instant = 0, direct = 1, relative = 2, instant_register = 3}; 

我正在使用以下函数 returning 枚举值:

char addressing_type(char *operand)
{
    switch (*operand)
    {
        case DIRECT_REGISTER_ADRESSING_START_SYMBOL:
            return (char)(instant_register); /*<- This line get executed. (checked via debugger)*/
         break;
        case INSTANT_ADRESSING_START_SYMBOL:
            return (char)(instant);
         break;
         case RELATIVE_ADRESSING_START_SYMBOL:
            if(!is_register(operand))
                return (char)(direct);
            return (char)(relative);
         break;
        default:
          return (char)(direct);
    }
}

当我尝试 return 3 (instant_register) 实际上 returned 的值是 1:

if((commands + i)->operands.first_free_index >= 1 && (temp.command_byte_form.desttype = addressing_type(get_item_at_index((commands + i)->operands, 0)) == instant_register))
/*value of temp.command_byte_form.desttype after this line of code is 1 (checked via debugger)*/

这是为什么?我怎样才能使函数 return 成为枚举的实际值?

编辑::desttype 是一个 2 位无符号整型位域

您必须提供有关代码的更多信息;但是 switch case 的 return 值是可以的。请避免复杂的条件。在条件之前的单独一行中使用 addressing_type 并查看结果。

运行 仅此代码,您可以看到结果是 3。

#include <stdio.h>
enum asm_adressing_types{instant = 0, direct = 1, relative = 2, instant_register = 3}; 

char addressing_type(char *operand)
{
    switch (*operand)
    {
        case 1:
            return (char)(instant_register); /*<- This line get executed. (checked via debugger)*/
         break;
         default:
            return (char)(direct);
    }
}

int main()
{
    printf("Hello World\n");
    char a[12] = {1};
    char c = addressing_type(a);
    printf("Hello World %d", c);
    
    return 0;
}

很可能,你的错误在于你的情况。

问题不是由 return 值、asm_adressing_types 的转换或枚举常量引起的,它们工作得很好。

应该是addressing_type函数里面的switch条件匹配失败造成的

指针参数 operand 很可能指向一个与 DIRECT_REGISTER_ADRESSING_START_SYMBOLINSTANT_ADRESSING_START_SYMBOL 的值不匹配的值,也可能不匹配 RELATIVE_ADRESSING_START_SYMBOL 第一种、第二种和第三种情况下的符号。

因此结果是打印 1direct 枚举常量的值,它在第三次被 return 编辑(当 is_register(operand) returned 0) 或默认 case.

这是它在 f.e 时正常工作的证明。 DIRECT_REGISTER_ADRESSING_START_SYMBOL 匹配 *operand:

Online

#include <stdio.h>

enum asm_adressing_types { instant = 0, direct = 1, relative = 2, instant_register = 3 }; 
enum symbols { DIRECT_REGISTER_ADRESSING_START_SYMBOL = 'A', INSTANT_ADRESSING_START_SYMBOL = 'B', RELATIVE_ADRESSING_START_SYMBOL = 'C' };

char addressing_type (char *operand);

int main (void)
{
    char a = 'A';
    char *p = &a;
    printf("%d", addressing_type(p));
}

char addressing_type (char *operand)
{
    switch (*operand)
    {
        case DIRECT_REGISTER_ADRESSING_START_SYMBOL:
            return (char)(instant_register); /*<- This line get executed. (checked via debugger)*/
            break;
        case INSTANT_ADRESSING_START_SYMBOL:
            return (char)(instant);
            break;
        case RELATIVE_ADRESSING_START_SYMBOL:
            if (1)                           // simplification for the sake of the experiment.
                return (char)(direct);
            return (char)(relative);
            break;
        default:
            return (char)(direct);
            break;
    }
}

输出:

3

请注意,枚举常量的转换和括号是多余的。您可以只使用:

return instant_register;