运算符是用于执行程序代码运算的符号,它们会针对一个或多个操作数进行运算。运算符的种类繁多,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。下面将详细介绍这些运算符的基本概念和用法。
1. 算术运算符
算术运算符用于执行基本的数学运算,包括加(+)、减(-)、乘(*)、除(/)和取模(%)。
- 加(+):将两个操作数相加。
dim aa as long = 1+2 ,bb as long = 3+4
aa += bb
print aa ,aa+bb
- 减(-):从第一个操作数中减去第二个操作数。
dim aa as long = 1-2 ,bb as long = 3-4
aa -= bb
print aa,aa-bb
- 乘(*):将两个操作数相乘。
dim aa as long = 1*2 ,bb as long = 3*4
aa *= bb
print aa,aa*bb
- 除(/):当两个操作数都是整数时,执行整数除法,结果也是整数,小数部分被丢弃;当操作数中包含浮点数时,执行浮点数除法,结果保留小数部分。
dim aa as long = 1/2 ,bb as long = 3/4
aa /= bb
print aa,aa/bb
- 取模(Mod):返回两个整数相除的余数。注意,负数取模的规则是结果的正负号由第一个操作数的正负号决定。
dim aa as long = 1 mod 2 ,bb as long = 3 mod 4
aa Mod= bb
print aa,aa mod bb
- 次方(^):计算数的指数次方
dim aa as long = 1 ^ 2 ,bb as long = 3 ^ 4
aa ^= bb
print aa,aa ^ bb
2. 关系运算符
关系运算符用于比较两个操作数的大小关系,包括大于(>)、小于(<)、等于(=)、不等于(<>)、大于等于(>=)和小于等于(<=)。
- 这些运算符返回的结果是布尔值(true或false),用于条件判断。
if 11<>22 or 3>6 then .......
aa = 11= 22 '前面等号是 赋值,后面等号是关系运算
3. 逻辑运算符
逻辑运算符用于执行布尔逻辑运算,包括逻辑与(And)、逻辑或(OR)和逻辑非(Not)。
- 逻辑与(And):当且仅当两个操作数都为真时,结果才为真。
a = 0 : b = 0 :print (a And b) '输出为 0
a = 1 : b = 0 :print (a And b) '输出为 0
a = 0 : b = 1 :print (a And b) '输出为 0
a = 1 : b = 1 :print (a And b) '输出为 1
- 逻辑或(Or):当至少有一个操作数为真时,结果就为真。
a = 0 : b = 0 :print (a Or b) '输出为 0
a = 1 : b = 0 :print (a Or b) '输出为 1
a = 0 : b = 1 :print (a Or b) '输出为 1
a = 1 : b = 1 :print (a Or b) '输出为 1
- 逻辑非(Not):将操作数的布尔值取反。
a = 0 : print Not(a) '输出为 1
a = 1 : print Not(a) '输出为 0
- 逻辑与或(Eqv)
a = 0 : b = 0 :print (a Eqv b) '输出为 1
a = 1 : b = 0 :print (a Eqv b) '输出为 0
a = 0 : b = 1 :print (a Eqv b) '输出为 0
a = 1 : b = 1 :print (a Eqv b) '输出为 1
- 逻辑蕴含(Imp)
a = 0 : b = 0 :print (a Imp b) '输出为 1
a = 1 : b = 0 :print (a Imp b) '输出为 0
a = 0 : b = 1 :print (a Imp b) '输出为 1
a = 1 : b = 1 :print (a Imp b) '输出为 1
- 逻辑异或(Xor)
a = 0 : b = 0 :print (a Xor b) '输出为 0
a = 1 : b = 0 :print (a Xor b) '输出为 1
a = 0 : b = 1 :print (a Xor b) '输出为 1
a = 1 : b = 1 :print (a Xor b) '输出为 0
4. 位运算符
位运算符用于对整数类型的二进制位进行操作,包括按位与(And)、按位或(Or)、按位异或(Xor)、按位取反(Not)、左移(Shl)和右移(Shr)。
- 按位与(And):对两个操作数的每一位执行逻辑与操作,如果两个对应位都是1,则结果位为1,否则为0。
- 按位或(Or):对两个操作数的每一位执行逻辑或操作,如果两个对应位至少有一个是1,则结果位为1,否则为0。
- 按位异或(Xor):对两个操作数的每一位执行逻辑异或操作,如果两个对应位不同,则结果位为1,如果相同,则结果位为0。
- 按位取反(Not):对操作数的每一位执行逻辑取反操作,将1变为0,将0变为1。
- 左移(Shl):将操作数的二进制位向左移动指定的位数,左边抛弃,右边补0。
- 右移(Shr):将操作数的二进制位向右移动指定的位数,具体是算数右移还是逻辑右移取决于编译器,算数右移左边用原来的符号位填充,逻辑右移左边用0填充。
5. 赋值运算符
赋值运算符用于将右侧操作数的值赋给左侧的变量,包括简单赋值(=)和复合赋值运算符(如+=、-=、*=、/=等)。
- 简单赋值(=):将右侧操作数的值赋给左侧的变量。
- 复合赋值:在赋值的同时进行算术或位运算,如a+=b等价于a=a+b。
6. 条件运算符(三目运算符)
条件运算符是唯一的三元运算符,格式为
aa = iif(条件表达式, 表达式1 , 表达式2)
- 如果条件表达式的值为真(非零),则整个条件表达式的值为表达式1的值;如果为假(零),则值为表达式2的值。
7. 其他运算符
除了上述运算符外,还有指针运算符(@和*)、求字节数运算符(sizeof)、强制类型转换运算符((类型))等,它们在特定场景下用于执行特定的操作。
运算符的优先级
不同运算符在表达式中的优先级不同,通常按照算术运算符、关系运算符、逻辑运算符的顺序从高到低排列。在复杂的表达式中,可以使用括号()来改变运算符的默认优先级。
| 操作者 | 描述 | 关联性 |
|---|---|---|
| CAST | 类型转换 | N/A |
| PROCPTR | 程序指针 | N/A |
| STRPTR | 字符串指针 | N/A |
| VARPTR | 变量指针 | N/A |
| [] | 字符串索引 | Left-to-Right |
| [] | 指针索引 | Left-to-Right |
| () | 数组索引 | Left-to-Right |
| () | 函数调用 | Left-to-Right |
| . | 成员访问 | Left-to-Right |
| -> | 指向成员访问 | Left-to-Right |
| @ | 的地址 | Right-to-Left |
| * | 取数据值 | Right-to-Left |
| New | 赋值内存 | Right-to-Left |
| Delete | 取消赋值内存 | Right-to-Left |
| ^ | 取幂 | Left-to-Right |
| - | 求反 | Right-to-Left |
| * | 乘 | Left-to-Right |
| / | 除以 | Left-to-Right |
| \ | 整数除法 | Left-to-Right |
| MOD | 余数 | Left-to-Right |
| SHL | 位左移 | Left-to-Right |
| SHR | 位右移 | Left-to-Right |
| + | 加 | Left-to-Right |
| - | 减去 | Left-to-Right |
| & | 字符串连接 | Left-to-Right |
| Is | 运行时类型信息检查 | N/A |
| = | 等于 | Left-to-Right |
| <> | 不平等 | Left-to-Right |
| < | 少于 | Left-to-Right |
| <= | 小于或等于 | Left-to-Right |
| >= | 大于或等于 | Left-to-Right |
| > | 大于 | Left-to-Right |
| NOT | 求位反码 | Right-to-Left |
| AND | 位逻辑与 | Left-to-Right |
| OR | 位逻辑或 | Left-to-Right |
| EQV | 等价 | Left-to-Right |
| IMP | 意义 | Left-to-Right |
| XOR | 位异或 | Left-to-Right |
| ANDALSO | 短路逻辑与 | Left-to-Right |
| ORELSE | 短路逻辑或 | Left-to-Right |
| = | 赋值 | N/A |
| &= | 连接和赋值 | N/A |
| += | 添加和赋值 | N/A |
| -= | 减去和赋值 | N/A |
| *= | 乘法和赋值 | N/A |
| /= | 除以和赋值 | N/A |
| \= | 整数分割和赋值 | N/A |
| ^= | 指数和赋值 | N/A |
| MOD= | 模数和赋值 | N/A |
| AND= | 连接和赋值 | N/A |
| EQV= | 等同和赋值 | N/A |
| IMP= | 含义和赋值 | N/A |
| OR= | 位或和赋值 | N/A |
| XOR= | 位异或和赋值 | N/A |
| SHL= | 向左移动并赋值 | N/A |
| SHR= | 向右移动并赋值 | N/A |
| LET | 赋值 | N/A |
| LET() | 赋值 | N/A |
注意事项
- 在使用运算符时,需要注意操作数的类型和范围,以避免数据溢出或类型不匹配的问题。
- 逻辑运算符和关系运算符的结果为布尔值,但在FB语言中通常用整数0表示假,非0值表示真。
- 在编写代码时,应注意运算符的优先级
评论一下?