您尚未登录。

#1 2017-08-06 17:58:19

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

这个程序为何没有任何输出?

#include <iostream>
#include <cstdint>

int main(){
        enum class A: std::uint8_t {
                _1 = 1,
                _2 = 2
        };
        A a{23};
        std::cout<<static_cast<std::uint8_t>(a)<<std::endl;
}

MSYS2 mingw32/gcc 7.1.0版本

g++ a.cpp -o a.exe -std=c++17编译

怎么解释这个结果?

最近编辑记录 xtricman (2017-08-06 18:03:18)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2017-08-06 18:10:12

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,877
个人网站

Re: 这个程序为何没有任何输出?

不会 C++17。不过我这里是有输出的——输出了一个换行。

离线

#3 2017-08-06 21:24:55

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 这个程序为何没有任何输出?

依云 说:

不会 C++17。不过我这里是有输出的——输出了一个换行。

倒与17没啥关系吧,我就觉得为啥不输出数字啊


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2017-08-06 22:41:05

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,877
个人网站

Re: 这个程序为何没有任何输出?

你这代码我不指定 C++17 编译不过的。

离线

#5 2017-08-07 20:55:50

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 331

Re: 这个程序为何没有任何输出?

有输出啊:

$ ./a.out|hexdump
0000000 0a17                                   
0000002

你的终端是不是不显示不可见字符?我这可以看到一个方块啊,0x17,正好是 23,没问题的……如果你的终端不显示不可见字符可以用 hexdump 看看。

最近编辑记录 zsrkmyn (2017-08-07 20:56:30)

离线

#6 2017-08-07 21:11:59

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,877
个人网站

Re: 这个程序为何没有任何输出?

zsrkmyn 说:

有输出啊:

$ ./a.out|hexdump
0000000 0a17                                   
0000002

你的终端是不是不显示不可见字符?我这可以看到一个方块啊,0x17,正好是 23,没问题的……如果你的终端不显示不可见字符可以用 hexdump 看看。

原来是这样!神奇的 C++……

离线

#7 2017-08-08 16:27:49

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 331

Re: 这个程序为何没有任何输出?

依云 说:

原来是这样!神奇的 C++……

因为本来 uint8_t 就是 char 类型,cout 输出 char 的时候直接输出字符(而不是输出其 ascii 值)。这是可以理解的,比如你写 cout << 'a'; 的时候希望看到的的是 a 而不是 97。
然后凑巧楼主又用了个控制字符。

最近编辑记录 zsrkmyn (2017-08-08 16:28:42)

离线

#8 2017-08-08 16:32:33

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,877
个人网站

Re: 这个程序为何没有任何输出?

zsrkmyn 说:

因为本来 uint8_t 就是 char 类型,cout 输出 char 的时候直接输出字符(而不是输出其 ascii 值)。这是可以理解的,比如你写 cout << 'a'; 的时候希望看到的的是 a 而不是 97。
然后凑巧楼主又用了个控制字符。

所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。

最近编辑记录 依云 (2017-08-08 16:33:06)

离线

#9 2017-08-08 17:12:20

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 这个程序为何没有任何输出?

因为本来 uint8_t 就是 char 类型

我……无fuck可说,彻底忘了字符类型虽然是整型却有不一样输出语义这件事情
我回去std:: byte再试一下
在测一些C++17的新玩意

论坛编辑器还会检查我qoute标签不对称啦?


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#10 2017-08-08 17:16:23

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 这个程序为何没有任何输出?

依云 说:

所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。

它还真的是,来自C99,就是个typedef,C++也带,进入std名字空间

名字空间仅限C++版,毕竟C版的头文件没有namespace

忘了C/C++最基础的一个坑


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#11 2017-08-08 17:16:52

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 331

Re: 这个程序为何没有任何输出?

依云 说:

所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。

哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……

离线

#12 2017-08-08 18:14:34

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,877
个人网站

Re: 这个程序为何没有任何输出?

zsrkmyn 说:
依云 说:

所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。

哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……

C++ 不能在兼容的同时,让 iostream 对它们区别对待么?

离线

#13 2017-08-08 18:51:06

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 这个程序为何没有任何输出?

C++的原生scalar类型真是坑


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#14 2017-08-08 18:58:07

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 这个程序为何没有任何输出?

依云 说:

C++ 不能在兼容的同时,让 iostream 对它们区别对待么?

是同一个类型啊,这些类型按要求就是整型,那就只能typedef了,不比char 16_t,byte之类的,没有要求是整型
Typedef的根本不可能区别,又不允许新建类型
你像byte就不是整形了


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#15 2017-08-08 19:59:18

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 331

Re: 这个程序为何没有任何输出?

依云 说:
zsrkmyn 说:
依云 说:

所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。

哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……

C++ 不能在兼容的同时,让 iostream 对它们区别对待么?

不能,因为假设 unsgined int 和 uint16_t 是两种不同的类型,然后写两个函数:

ostream & operator<< (ostream & o, unsigned int arg) {...}
ostream & operator<< (ostream & o, uint16_t arg) {...}

那么写 cout << 16; 的时候,该如何决定调用那个函数呢?

离线

页脚