📅 财经日历 📊 实时波动 📈 大盘云图 📶 行情走势 🆚 投机情绪 🚀 今日热点

    自增、自减运算符和逻辑运算符(特厉害的MT5/MQL5指标编程教程第十篇:优先级、自...

    億秒 LV7
    2014-02-18 · 1250 阅读
    在表达式求值时,按运算符的优先规则高低次序进行结合,如先乘除后加减,“a + b * c”相当于“a + (b * c)”。如果优先级相同,则按规定的“结合方向”处理。

    数学课上算术式的结合方向大部分都是由坐至右的,但是EA和指标编程中,有部分运算符是由右向左结合的,比如“a = b;”,是把b的值赋给a,如果初始值是a为1、b为2,那么执行后a和b都等于2。再比如“a+++b;”相当于“a + (++b);”而非“(a++) + b;”。

    两个加号(“++”)是自增运算符,“++a”相当于“a = a + 1;”,而“++a”和“a++”的区别看一下下面的示例:

    // 声明变量。
    int a, b, x, y;
    // 赋值。
    a = 0;
    x = 0;
    b = 1;
    y = 1;
    a = b++;
    x = ++y;

    最后,a=1、b=2、x=2、y=2。一定要注意,a=1不是因为“(a = b)++;”,首先自增和自减运算符只能用于变量,“a = b”是个表达式,不能用;其次这个表达式的优先级还是先结合自增运算:“a = (b++);”。但是当两个加号再后面的时候,会先把变量的值代入表达式执行,再自己加1。而当自增或自减运算符在变量左边时,就会先自增或自减,后代入表达式。

    如果我写“a = a+++++b;”则会被结合成“a = a + (++(++b));”,自增运算符不能用于表达式,所以这么写无法通过编译。初始值“a”为“0”、“b”为“1”,“a = (a++) + ++b;”后,“a”的值为多少呢?自己算一算再往下看。

    赋值运算会先算等号右边的部分,“(a++) + ++b”变成“(0++) + ++1”,再变成“(0++) + 2”,这个表达式的值为“2”,而此时“a”该“+1”了,“a = 0 + 1;”之后,又该把“(0++) + 2”的值赋给“a”了,所以最终“a”的值为“2”。可能看上去有点乱,多用用就好了,或者尽量避免在同一表达式中连续使用自增、自减运算符。

    “a = a + 1;”还有一种写法:“a += 1;”,它比自增运算符灵活的地方是可以“a += 2;”。“a -= 1;”同理。

    上一篇讲的if...else结构,大部分都是以逻辑运算作为判断条件,逻辑运算只有两个结果:“真”、“假”。

    a && b
    读作:“a与b”,若“a”和“b”都为“真”,则表达式的值为“真”。
    a || b
    读作:“a或b”,若“a”和“b”其中任意一个为“真”,则表达式的值为“真”。
    !a
    读作:“非a”,若“a”为“真”,则表达式的值为“假”。
    举几个例子:

    bool a = true;
    bool b = false;
    int c = 1;
    a && b; // 为假。
    a || b; // 为真。
    !b; // 为真。
    !(c > 0); // 为假。

    另外“!a || b $$ c”的结合规则为“(!a) || (b $$ c)”。“非”的优先级 > “与”的优先级 > “或”的优先级。下一篇列出所有运算符和优先级,太长了占篇幅,单开一篇。

    ""
    还没有人打赏,支持一下
    回复

    举报

     
    微信二维码

    有问题联系客服