比较规则

本文详细介绍了比较运算符的使用规则以及不同数据类型之间的兼容性和比较方式,包括基本类型、结构、内表以及非兼容类型之间的比较规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较规则

=, EQ, <>, NE, <, LT, >, GT, <=, LE, >=, GE

非引用数据类型的兼容要求

l  就基本类型来说,需要类型、长度(for the types c, n, p, x)、小数位(for the type p)匹配

l  对于结构来说,要求必须具有相同的组成成份(组件声明的顺序与类型),并且相对应的组件必须是兼容的,与名称没有关系

l  对于内表来说,行类型必须兼容,与内表的类型与关键字没有关系。

兼容基本类型之间的比较

兼容类型数据之间的比较是不会发生类型转换的:

  • 数字类型 (i, f, p)之间的比较,会按照所存储的数字值的大小进行比较。由于f类型依赖于平台,会有误差,不要对f类型进行相等相关的比较.
  • 字符类型(c, d, n, t, string) 之间的比较,会从左到右逐个字符进行比较。如果两个操作数都是n类型时,会转换为对应数字后进行比较。
  • 字节类型(x, xstring),之间的比较,会从左到右逐字节进行比较
非兼容基本类型之间的比较

如果不兼容的两个基本类型数据之间进行比较,会根据以下规则进行转换:

类型相同但长度不同之间的比较
  • 如果操作数都是p,则会比较数字值的大小。
  • 针对c类型的操作数,短操作数的长度会在右边添加空格扩展到长的操作数同样长度后再进行比较。
  • 不同长度的string类型操作数通常是不相等的。

DATA: str1 TYPE string VALUE `AA`,
      str2
TYPE string VALUE `AA `.str1会小于
str2

DATA: str1 TYPE string VALUE 'AA',
      str2
TYPE string VALUE 'AA '.
相等

  • 针对n类型的两个操作数,会在较短操作数左边补上0直到与较长操作数长度相等。
  • 针对x类型的两个操作数,会在较短操作数左边补上十六进制0直到与较长操作数长度相等。
  • 不同长度的Xstring类型操作数通常是不相等的.
不同类型之间的比较

只有比较时才有以下的优先级,赋值转换时不会存在这种优先级,因为赋值之前就已经确了目标类型,但比较时是要在运行时才能动态的决定,这种决定时就会用到下面的优先级规则

 

如果进行比较的操作数类型不同,则会先按照以下优先顺序确定要转换的类型,然后再根据基本类型转换规则表进行转换,最后再进行比较:

  1. 如果其中某个操作数类型为数字类型fpi,则会按照先f、再p、最后i的优先转换次序进行转换(与Java转换规则是一样的:如果有f,则转换为f;如果没有f,但有p时,转换为p;如果既没有f,也没有p,而存在i时,则转换为i类型)。
  2. 否则,如某个操作数是d或者是t类型,且另一个操作数为数字类型(i, f, p),则dt转换为相应的数字类型。
  3. 否则,如果某个操作数是d或者t,另一个操作数是除dt类型外的字符类型(c, n, string)时,则dt将被当作字符类型进行处理。如果一操作是d而另一个是t时,则会抛出异常。
  4. 否则,如果某一个操作数为n,另一个操作数为c, string, x, or xstring时,两个操作数都会转换为p类型。
  5. 否则,如果某个操作数为固定长度类型(c or x),另一个操作数为变长类型(string or xstring)时,固定长度类型的操作数会被转换为相应的可变长度的类型(c to string, x to xstring)
  6. 否则,如果一个操作数为字节类型(x, xstring),另一个为字符类型(c, string),则字节类型被转换为相应字符类型(x to c, xstring to string)
在 C# 中,字符串的 CompareTo() 方法用于比较两个字符串,并返回一个整数值,表示比较结果的大小关系。该方法有多个重载形式,其中一个重载形式允许指定比较规则。 默认情况下,CompareTo() 方法使用当前文化(Culture)下的比较规则进行字符串比较。这意味着,如果在不同的文化环境中使用该方法进行字符串比较,可能会得到不同的结果。 可以使用 StringComparison 枚举类型中的成员来指定不同的比较规则,例如: - StringComparison.CurrentCulture:使用当前文化的比较规则进行字符串比较。 - StringComparison.InvariantCulture:使用固定文化(Invariant Culture)的比较规则进行字符串比较,这种比较方式不受当前操作系统文化设置的影响。 - StringComparison.Ordinal:按照字符的 Unicode 值进行比较,不考虑语言和文化差异。 例如,以下代码使用当前文化的比较规则比较两个字符串: ```csharp string str1 = "apple"; string str2 = "banana"; int result = str1.CompareTo(str2); ``` 如果当前文化为英语(美国),则 result 的值为一个负整数,表示 str1 小于 str2。 如果要使用不同的比较规则进行字符串比较,可以将 StringComparison 枚举类型作为第二个参数传递给 CompareTo() 方法,例如: ```csharp string str1 = "apple"; string str2 = "banana"; int result = str1.CompareTo(str2, StringComparison.InvariantCulture); ``` 这将使用固定文化的比较规则进行字符串比较,不受当前操作系统文化设置的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值