C++ 如果条件不是',我是否应该选择两个if语句而不是if-else语句;不相关?
所以我知道,一般来说,我更喜欢C++ 如果条件不是',我是否应该选择两个if语句而不是if-else语句;不相关?,c++,if-statement,C++,If Statement,所以我知道,一般来说,我更喜欢else if而不是if。但如果这两个条件不相关呢?例如,这些将被视为“相关”条件: if(行[a]='{'){ openCurly=true; } 如果(第[a]='}'行){ closeCurly=false; } 注意if语句中的两个条件是如何相互关联的,当一个是true时,另一个必须是false。这是因为行[a]可以是{或},但不能两者都是 下面是另一个例子: if(行[a]='{') { openCurly=true; } else if((行[a]='
else if
而不是if
。但如果这两个条件不相关呢?例如,这些将被视为“相关”条件:
if(行[a]='{'){
openCurly=true;
}
如果(第[a]='}'行){
closeCurly=false;
}
注意if语句中的两个条件是如何相互关联的,当一个是true
时,另一个必须是false
。这是因为行[a]
可以是{
或}
,但不能两者都是
下面是另一个例子:
if(行[a]='{')
{
openCurly=true;
}
else if((行[a]=';'&&&!openCurly)| |(行[a]='}'&&openCurly))
{
剂量测定(线);
第“”行;
}
如果第一个条件为true,则第二个条件的计算结果将永远不会为true,因此如果,则使用else是有意义的。然而,这两个条件看起来大不相同
那么,我应该喜欢这样的东西吗
if(行[a]='{')
{
openCurly=true;
}
if((行[a]=';'&&&!openCurly)| |(行[a]='}'&&openCurly))
{
剂量测定(线);
第“”行;
}
您应该使用else if
语句。这是因为if-else
构造仅在第一条语句的计算结果不为true时检查第二条语句
在你举的例子中
if (line[a] == '{')
{
openCurly = true;
}
else if ((line[a] == ';' && !openCurly) || (line[a] == '}' && openCurly))
{
DoSomething(line);
line = "";
}
用if
语句替换else if
将导致检查第二个条件,即使第一个条件为真,这完全没有意义,也会浪费您一些时间
将来,根据条件是否相互排斥,决定使用else if
语句。您可以这样做:
#include <stdint.h>
#define COMBINATION(x,y) ((uint16_t(x)<<8)|(uint16_t(y)<<0))
...
switch (COMBINATION(line[a],openCurly))
{
case COMBINATION('{',false):
...
break;
case COMBINATION(';',false):
case COMBINATION('}',true):
...;
break;
}
}
#包括
#定义组合(x,y)((uint16_t(x)行[a]
怎么可能是;
或}
,同时也{
?如果方法,使用否则。也不应该使用行[a]='}“
branch setopenCurly=false
?根据条件是否相互排斥做出决定,而不是根据条件的外观。我编写了很多代码,没有其他选择,因为在if块中,我中断、继续、返回或退出(),这些语句之后就没有生命了!if和else创建分支,通过清空指令缓冲区来降低CPU的速度,或者通过推测执行来降低CPU的速度,因此,如果您可以在不使用if、else或三元运算符的情况下计算答案,那就更好了!这种想法有助于创建浮点NAN,因此矩阵处理可以在rward不需要对矩阵的任何部分进行条件处理:例如,如果有人得到一个除以零的结果,他们只返回NAN并继续计算。先做无条件工作,然后再做条件工作是优化代码的一个好方法。但是,先删除异常,留下一个更简单的宇宙,使用uncon传统的处理。分散if只会更频繁地扰乱CPU。这里有一个很好的讨论,我相信David正试图提出的观点:TL;DR:安排程序以最大限度地提高可预测性。补充:如果你真的有完全且仅依赖于一个变量的东西,你可能想使用开关盒
,因为它不仅比if-else
节省了大量的时间,而且更能说明所有可能的值。如果我只有两个if语句会怎么样?我是否仍应该使用switch
?当您有很多情况需要用一个值检查时,请使用switch
。“switch”语句通常更短,更容易阅读而不是else if
语句。如果只有2个案例需要检查,我个人不会使用开关
。@是的。根据经验,我会说4个以上的案例。“即使第一个是真的,也会导致第二个条件被检查,”如果编译器进行了优化(这是允许的),则不适用。但是为什么在这里使用宏?请不要建议这样做。一个简单的函数就可以了。@cigien:它们显然不一样。从性能角度看,预处理器定义可能更好(取决于编译器优化等).Code size wize,函数可能会更好(再次取决于编译器)。按调试的方式,函数会更好(更容易调试),但是如果正确编写预处理器定义,则甚至不需要调试代码的那个区域。如果您对此注释的唯一理由是“C++中的情况就是这样的”然后我建议你换一个职业,去法学院什么的。每个专家都建议不要使用宏(不包括一些你无法回避的边缘案例).性能方面不,没有区别。尤其是现代编译器优化amaginz算法。尤其是constepr
和新的consteval
。它们根本不值得。@goods是的,函数在这种情况下同样不可读。回到宏:using macros和讨论中唯一的潜在优势是性能,而现在这不是优势。所以,是的,我听了该领域专家的意见,但我也听了他们的观点,我认为没有理由使用macros。无论如何,这场讨论偏离了轨道。我说了我必须说的。从我的角度来看,这就到此为止.也许这里的一些答案会更有说服力。尽管这些答案只是专家的意见。我不确定你反对的是专家的建议。