程序的基础功能之一就是做判断。判断语句通过评估条件的真伪作出决定。MQL5中有三个条件判断语句:if - else,三目操作符,和switch - case语句。
前面章节其实我们已经介绍过了,程序内最常用。if语句内可包含许多业务逻辑。
bool c = true;
if (c == true){
Print('yes,true!');
}
上面的语句当然是真的。
说一个语法糖。就是如果if语句内只有一条语句,那连大括号都可以省了。开头给个tab即可。
bool c = true;
// 换一行写
if(c == true)
Print('yes,true!');
// 连着写
if(c == true) Print('yes,true!');
效果是一样的。语句以分号结束。这个特性,很多编译型语言都有。每个if少写一对大括号,一个文件能省几十个,一天能省不少时间,几年下来就能大神了!!哈哈~~
int a = 2;
if(a > 1) Print('yes');
if(a < 3) Print('of course');
这样写,很省心啊。
if语句判断为真执行,那么其他情况呢。条件不成立的其他情况呢?我们也得处理,else字句就是做这个的。
bool c = false;
if (c==true) Print('yes');
else Print('no');
看到没有,一个if,一个else,把所有的情况都考虑好了,这叫滴水不漏。复杂点儿的例子。说学生成绩60分以下输出不及格,60-80分输出及格,80-100分,优秀。
double score = 78.5;
if(score < 60)
Print('不及格');
else if(score < 80)
Print('及格');
else
Print('优秀');
条件自上而下依次执行,遇到条件满足,就执行其中的语句。注意,如果判断条件写的不合适,有可能接连触发好几个哦。
为了简化if-else语句,发明了这个语法糖。
bool c = true;
string r = c == true ? 'yes' : 'no';
Print(r); // = yes
也即是?之前是判断条件,如果成立,执行:左边的句子,不成立只有:右边的句子。其实相当于:
bool c = true;
string r = '';
if(c==true){
r = 'yes';
}else{
r = 'no';
}
Print(r); // = yes
上述两段执行效率一样。只是三木运算符,把变量声明,条件判断,语句赋值这三项,合并到一行执行,在编程风格上简洁了不少。可以加大使用力度。
如果判断情况较多,写一堆if不方面,容易形成一大堆乱糟糟的代码。所以switch-case语句。注意,switch-case也不是最好的结构哦。在最佳实践中,很多有名的github上的高评代码库,if-else用的还是最多。为何?方便维护。switch改起来太费劲了。体验不好。而且处处得break,你不跳出,谁知道他给你执行那一段?oh sh!t。
int x = 1;
switch(x)
{
case 1:
Print("x is 1"); // 输出: x is 1
break;
case 2:
Print("x is 2");
break;
default:
Print("x is not 1 or 2");
}
switch语句要求case列举出的是其判断语句的所有可能值,当然还有个default用于处理列举不出来的值。
我们不是写航天代码的,一般控制不了全部的局面,switch用起来就不爽了。所以我个人不推荐。因为你稍不留神,就能写出这些一撸到底的代码:
int x = 1;
switch(x)
{
case 1:
case 2:
case 3:
Print("x is 1, 2 or 3"); // 输出: x is 1, 2 or 3
break;
default:
Print("x is not 1, 2, or 3");
break;
}
看见没,case=1,2,3,一次往下走,只要命中一个,都得把case里的语句走一遍,直到break!
大多数时候,if-else工作的很好的,switch-case给你一个额外的选项,多一个实现的方法。下面举例,比如是给出图表周期,分钟数,如果60分钟=1小时,240分钟=4小时,1440分钟=1天等等:
int period = _Period;
string printPeriod;
switch(period)
{
case 60:
printPeriod = "H1";
break;
case 240:
printPeriod = "H4";
break;
case 1440:
printPeriod = "D1";
break;
default:
printPeriod = "M" + period;
}
if-else也可以写,无非使用if(period==60)这样的格式依次判断即可,不具体写了。