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_SYMBOL
、INSTANT_ADRESSING_START_SYMBOL
的值不匹配的值,也可能不匹配 RELATIVE_ADRESSING_START_SYMBOL
第一种、第二种和第三种情况下的符号。
因此结果是打印 1
,direct
枚举常量的值,它在第三次被 return 编辑(当 is_register(operand)
returned 0
) 或默认 case
.
这是它在 f.e 时正常工作的证明。 DIRECT_REGISTER_ADRESSING_START_SYMBOL
匹配 *operand
:
#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;
我有一个枚举:
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_SYMBOL
、INSTANT_ADRESSING_START_SYMBOL
的值不匹配的值,也可能不匹配 RELATIVE_ADRESSING_START_SYMBOL
第一种、第二种和第三种情况下的符号。
因此结果是打印 1
,direct
枚举常量的值,它在第三次被 return 编辑(当 is_register(operand)
returned 0
) 或默认 case
.
这是它在 f.e 时正常工作的证明。 DIRECT_REGISTER_ADRESSING_START_SYMBOL
匹配 *operand
:
#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;