sha*_*oth 4 c++ arrays pointers
我有这个代码:
int main()
{
char buffer[10];
if( buffer ) {
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Visual C++ 10解释如下:buffer衰减到指针,然后将指针与null进行比较.当使用/ O2编译时,检查将被删除,代码将等同于return 1;.
以上代码有效吗?Visual C++是否正确编译(我的意思是衰减部分,而不是优化)?
C++ 11,6.4/4:
作为表达式的条件的值是表达式的值,对于除switch之外的语句,上下文转换为bool; 如果转换形成不良,该计划就是格式错误.
因此标准规定编译器必须执行任何隐式转换,以将数组转换为布尔值.将数组衰减到指针并将指针转换为boolean并使用针对null的测试转换为null是一种方法,所以是的,程序是明确定义的,是的,它确实产生了正确的结果 - 显然,因为数组是在堆栈上分配,它衰减的指针永远不能等于空指针.
更新:至于为什么要遵循这两个转换链:
C++ 11,4.2/1:
可以将"数组的NT"或"未知的T的数组"类型的左值或右值转换为"指向T的指针"的prvalue.结果是指向数组的第一个元素的指针.
因此,从数组类型的唯一合法转换是指向元素类型的指针.第一步没有选择.
C++ 11,4.12/1:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为类型的prvalue
bool.将零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型std::nullptr_t的prvalue可以转换为类型的prvaluebool; 结果值是false.
直接从裸指针到布尔值的转换; 所以编译器选择它作为第二步,因为它允许立即达到所需的结果(转换为布尔值).
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |