gpt4 book ai didi

char 类型的 C++ 枚举,被编译器忽略或意外行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:43 25 4
gpt4 key购买 nike

我用枚举做了一个小测试,这是我拥有的:

enum anyoldname : char
{
aa = 'a', ab = 'b', ac = 'c', ad = 'd'
};

int main()
{

anyoldname i_have_an_enum_here = aa; // Would expect i_have_an_enum_here to be of type char?

std::cout << i_have_an_enum_here << std::endl;

return 0;
}

输出是:98,除非我像这样显式转换为 char:

std::cout << (char)i_have_an_enum_here;

或者将anyoldname改为char

为什么打印的是 98 而不是 b

顺便说一句,sizeof() 返回1,即; 1 个字节,一个 char

最佳答案

没有 强制转换,编译器首先搜索std::ostream 的适当成员函数。 ,它找到了一个——int 的那个.因此它隐式转换类型为 anyoldname 的 1 字节数到int并调用成员函数。

使用 g++ 4.8.1 编译程序,ostream::operator<< 的两个定义可见:

     U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
U std::ostream::operator<<(int)@@GLIBCXX_3.4

第一个是 endl第二个是你的枚举。

通过显式转换为 char,编译器能够在全局 std::operator<< 中找到完美匹配接受 ostream 的函数和一个 char作为输入。然后它使用此函数而不是进行隐式转换(再次转换为 int)以调用 ostream。成员函数。

两个符号变成:

     U std::ostream::operator<<(std::ostream& (*)(std::ostream&))@@GLIBCXX_3.4
U std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)

并且您的值被打印为字符而不是它们的十进制值。

关于char 类型的 C++ 枚举,被编译器忽略或意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com