C++ 如果容器';在同一条件语句下验证和访问元素的大小?
以下哪一种代码在两种代码之间更可取?为什么 1.C++ 如果容器';在同一条件语句下验证和访问元素的大小?,c++,c++11,visual-c++,c++14,C++,C++11,Visual C++,C++14,以下哪一种代码在两种代码之间更可取?为什么 1. std::stack<int>stk; //Do something if( stk.empty() == true || stk.top() < 10 ) { //Do something. } std::stackstk; //做点什么 如果(stk.empty()==true | | stk.top()
std::stack<int>stk;
//Do something
if( stk.empty() == true || stk.top() < 10 )
{
//Do something.
}
std::stackstk;
//做点什么
如果(stk.empty()==true | | stk.top()<10)
{
//做点什么。
}
或
2
std::stack<int>stk;
//Do something
if( stk.empty() == true )
{
//Do something.
}
else if( stk.top() < 10 )
{
//Do something.
}
std::stackstk;
//做点什么
if(stk.empty()==true)
{
//做点什么。
}
否则如果(stk.top()<10)
{
//做点什么。
}
这完全取决于用例。在第一个代码中,您有一个空堆栈的或条件,如果元素存在,则检查元素的值。所以,这很清楚,你可以继续代码
在第二段代码中,您希望对这两种条件执行不同的操作。因此,您已将条件放入if-else循环中
当你不想让你的代码中断或通过死角测试用例时,好的实践是有意义的。当堆栈为空时,你可能不想在代码中包含任何东西
std::stack<int>stk;
if(stk.top() < 10 )
{
//Do something.
}
else if(stk.empty() == true)
{
//Do something
}
std::stackstk;
如果(stk.top()<10)
{
//做点什么。
}
else if(stk.empty()==true)
{
//做点什么
}
这将生成运行时错误,因为堆栈为空,但您在检查堆栈为空条件之前正在访问top元素。
我希望答案能说明问题 这完全取决于用例。在第一个代码中,您有一个空堆栈的或条件,如果元素存在,则检查元素的值。所以,这很清楚,你可以继续代码 在第二段代码中,您希望对这两种条件执行不同的操作。因此,您已将条件放入if-else循环中 当你不想让你的代码中断或通过死角测试用例时,好的实践是有意义的。当堆栈为空时,你可能不想在代码中包含任何东西
std::stack<int>stk;
if(stk.top() < 10 )
{
//Do something.
}
else if(stk.empty() == true)
{
//Do something
}
std::stackstk;
如果(stk.top()<10)
{
//做点什么。
}
else if(stk.empty()==true)
{
//做点什么
}
这将生成运行时错误,因为堆栈为空,但您在检查堆栈为空条件之前正在访问top元素。
我希望答案能说明问题 内置运算符
&&
和| |
执行短路求值(如果求值第一个操作数后知道结果,则不要求值第二个操作数)。因此,表达式stk.empty()| | stk.top()<10
是安全且良好的做法,stk.top()
仅在stk.empty()
计算结果为false
时调用。换句话说,运算符的设计就是为了启用这种用法。内置运算符&&
和|
执行短路求值(如果在求值第一个操作数后知道结果,则不要求值第二个操作数)。因此,表达式stk.empty()| | stk.top()<10
是安全且良好的做法,stk.top()
仅在stk.empty()
计算结果为false
时调用。换句话说,操作符的设计就是为了支持这种用法。它们有不同的含义,所以。。。取决于代码需要执行的操作。第一个是or运算符。因此,在特定的时间,它有两部分是真实的。但第二种方法不能同时满足这两种条件。所以不能比较这两种方法。给出的答案是不同的。如果做某事
是等价的。那么首选第一个。你应该尽量不要重复。是的,做一些事情是等效的。注意stack.empty()
返回bool
;不需要==true
。它们有不同的含义,所以。。。取决于代码需要执行的操作。第一个是or运算符。因此,在特定的时间,它有两部分是真实的。但第二种方法不能同时满足这两种条件。所以不能比较这两种方法。给出的答案是不同的。如果做某事
是等价的。那么首选第一个。你应该尽量不要重复。是的,做一些事情是等效的。注意stack.empty()
返回bool
;不需要==true
“这将生成分段错误,因为堆栈是空的”,这并不能保证代码只会调用未定义的行为。在答案中添加了编译错误管理单元。这不是编译错误,而是运行时错误。再说一次,这或多或少是没有意义的,它只是无限多可能性中的一种,因为行为是未定义的,其中一种可能性就是运行得很好,如图所示。我指的是运行时错误。是的,这是一种可能性,但最好避免。“这将产生分段错误,因为堆栈是空的”这并不能保证,正式来说,代码只会调用未定义的行为。在答案中添加了编译错误管理单元。这不是编译错误,而是运行时错误。再说一次,这或多或少是没有意义的,它只是无限多可能性中的一种,因为行为是未定义的,其中一种可能性就是运行得很好,如图所示。我指的是运行时错误。是的,这是一种可能性,但最好避免。这很好地解释了示例1中发生的情况,但没有回答OP关于哪种形式的代码更好的问题。这很好地解释了示例1中发生的情况,但没有回答OP关于哪种形式的代码更好的问题。