MQL5从入门到精通【第四章】(一)条件判断语句

2020-04-08 11:19:36 浏览数 (1)

# 判断语句

程序的基础功能之一就是做判断。判断语句通过评估条件的真伪作出决定。MQL5中有三个条件判断语句:if - else,三目操作符,和switch - case语句。

## if语句

前面章节其实我们已经介绍过了,程序内最常用。if语句内可包含许多业务逻辑。

代码语言:javascript复制
bool c = true;
if (c == true){
    Print('yes,true!');
}

上面的语句当然是真的。

说一个语法糖。就是如果if语句内只有一条语句,那连大括号都可以省了。开头给个tab即可。

代码语言:javascript复制
bool c = true;

// 换一行写
if(c == true)
    Print('yes,true!');

// 连着写
if(c == true) Print('yes,true!');

效果是一样的。语句以分号结束。这个特性,很多编译型语言都有。每个if少写一对大括号,一个文件能省几十个,一天能省不少时间,几年下来就能大神了!!哈哈~~

代码语言:javascript复制
int a = 2;
if(a > 1) Print('yes');
if(a < 3) Print('of course');

这样写,很省心啊。

## else操作符

if语句判断为真执行,那么其他情况呢。条件不成立的其他情况呢?我们也得处理,else字句就是做这个的。

代码语言:javascript复制
bool c = false;

if (c==true) Print('yes');
else Print('no');

看到没有,一个if,一个else,把所有的情况都考虑好了,这叫滴水不漏。复杂点儿的例子。说学生成绩60分以下输出不及格,60-80分输出及格,80-100分,优秀。

代码语言:javascript复制
double score = 78.5;
if(score < 60)
    Print('不及格');
else if(score < 80)
    Print('及格');
else
    Print('优秀');

条件自上而下依次执行,遇到条件满足,就执行其中的语句。注意,如果判断条件写的不合适,有可能接连触发好几个哦。

## 三目运算符

为了简化if-else语句,发明了这个语法糖。

代码语言:javascript复制
bool c = true;
string r = c == true ? 'yes' : 'no';
Print(r); // = yes

也即是?之前是判断条件,如果成立,执行:左边的句子,不成立只有:右边的句子。其实相当于:

代码语言:javascript复制
bool c = true;
string r = '';
if(c==true){
    r = 'yes';
}else{
    r = 'no';
}
Print(r); // = yes

上述两段执行效率一样。只是三木运算符,把变量声明,条件判断,语句赋值这三项,合并到一行执行,在编程风格上简洁了不少。可以加大使用力度。

## 分支语句 switch - case

如果判断情况较多,写一堆if不方面,容易形成一大堆乱糟糟的代码。所以switch-case语句。注意,switch-case也不是最好的结构哦。在最佳实践中,很多有名的github上的高评代码库,if-else用的还是最多。为何?方便维护。switch改起来太费劲了。体验不好。而且处处得break,你不跳出,谁知道他给你执行那一段?oh sh!t。

代码语言:javascript复制
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用起来就不爽了。所以我个人不推荐。因为你稍不留神,就能写出这些一撸到底的代码:

代码语言:javascript复制
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天等等:

代码语言:javascript复制
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)这样的格式依次判断即可,不具体写了。

0 人点赞