Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果容器';在同一条件语句下验证和访问元素的大小?_C++_C++11_Visual C++_C++14 - Fatal编程技术网

C++ 如果容器';在同一条件语句下验证和访问元素的大小?

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()

以下哪一种代码在两种代码之间更可取?为什么

1.

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关于哪种形式的代码更好的问题。