自增、自减运算符和逻辑运算符(特厉害的MT5/MQL5指标编程教程第十篇:优先级、自...
億秒
|
947 人阅读
|
0 人评论
|
2014-02-18
在表达式求值时,按运算符的优先规则高低次序进行结合,如先乘除后加减,“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)”。“非”的优先级 > “与”的优先级 > “或”的优先级。下一篇列出所有运算符和优先级,太长了占篇幅,单开一篇。
|
|
|
|
|