C语言常量解析疑问:为何0xe+2编译失败而0xe +2成功?
为什么
0xe+2编译失败,0xe +2却能正常运行? 作为一名摸爬滚打多年的C语言开发者,我最近碰到了个挺有意思的语法坑——下面两行代码,居然一行正常编译,一行直接报错:
// 这行完全没问题 int main( void ) { return (0xe +2); } // 这行会编译失败 int main( void ) { return (0xe+2); }
用gcc -s weird.c编译第二行代码时,会得到这样的错误提示:
weird.c: In function ‘main’:
weird.c:1:28: error: invalid suffix "+2" on integer constant
int main( void ) { return (0xe+2); }
^
问题的核心:C语言的常量解析规则
这里的关键在于C语言对常量的解析优先级。当你写0xe+2时,编译器会把它当成一个十六进制浮点型常量来尝试解析,而不是你预期的“十六进制整数0xe加上整数2”。
按照C语言的语法规范,十六进制浮点常量的正确格式是0x[数字/字母][.数字/字母][p/P指数]——比如0xeP+2才是合法的写法,表示14 * 2^2。但0xe+2里的+2没有以p开头,编译器会把它误认为是整数常量的非法后缀,所以直接抛出错误。
而当你在0xe和+2之间加了空格后,编译器就会正确识别出:0xe是一个十六进制整数(值为14),+2是单独的加法操作数,自然就能正常编译执行了。
内容的提问来源于stack exchange,提问作者Baard
相关产品推荐
相关产品推荐

