使用数组作为在C++中有效的条件表达式?

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++是否正确编译(我的意思是衰减部分,而不是优化)?

Jon*_*Jon 7

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可以转换为类型的prvalue bool; 结果值是false.

直接从裸指针到布尔值的转换; 所以编译器选择它作为第二步,因为它允许立即达到所需的结果(转换为布尔值).