char变量是否始终表示为带有{'x',\ 0}的解除引用的char*[2]?

Sla*_*zer 0 c c++ casting char c++11

我尝试了这种方法将char数字转换为整数位('3' - > 3),它似乎工作.

char c='x';
int i=atoi(&c);
Run Code Online (Sandbox Code Playgroud)

我的问题是,这总是有效吗?

第一个字符后是否总是有一个NULL字符?

使用隐式类型转换还有另一种方法可以做到这一点,但我不确定这是一个好习惯.实际上,我很惊讶即使使用-Wall和-Wextra也没有任何警告.

int i = c - '0';
Run Code Online (Sandbox Code Playgroud)

注意我正在使用GCC 4.8.2和MinGW.

cad*_*luk 5

这编译但它是未定义的行为.

A char只是一个角色.没有空字节跟随.std::atoi但是期望一个空字节,因此调用std::atoi(&c)编译但会产生未定义的行为.这条线,

int i = std::atoi("x");
Run Code Online (Sandbox Code Playgroud)

但是,它是明确定义的,因为字符串"x"是一个以char[2]null结尾的.

int i = c - '0';
Run Code Online (Sandbox Code Playgroud)

是好的,因为1C++ 11标准C99标准2保证的字符数字的顺序.


1 @ShafikYaghmour在你的问题评论中指出

2再次感谢@ShafikYaghmour!

  • @Slazer这是未定义的行为.它可能会起作用,但它也可以让你的鼻子飞出你的鼻子. (5认同)