为什么我不能只使用51 <= j <= 55?/数据类型

-3 c

这是关于信用卡问题.因此,如果数字是16位且前两位是51,52,53,54或55,则该卡是万事达卡.

起初,我试过了(51 <= j <= 55).我认为这种情况是有道理的.原因j是整数.但由于某种原因,错误说(51 <= j <= 55)永远是真的(我不明白这一点!).所以我不得不写(j==51 || j==52 || j==53 || j==54 || j==55),这基本上是一样的(51 <= j <= 55).

int j = c / pow(10,14);

if(pow(10,15) <= c < pow(10,16) && (j==51 || j==52 || j==53 || j==54 || j==55)) 
{
    printf("MASTERCARD\n");
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作得很好..(我不知道为什么)而且我不得不做一些改动j,从... double jint j.我想这是因为51到55的数字是整数..?

无论如何,错误没有说什么pow(10,15) <= c < pow(10,16).为什么我不能用51 <= j <= 55

Mat*_*lia 7

为什么我不能只使用51 <= j <= 55

因为这是解析中的一个"特殊情况",因为你已经习惯了它,但在C语言表达式语法中根本不明显.

如果您应用C的解析和优先级规则,您将得到一个表达式,它可能不是您想要的:

51 <= j <= 55
Run Code Online (Sandbox Code Playgroud)

被解析为

(51 <= j) <= 55
Run Code Online (Sandbox Code Playgroud)

51 <= j是一个布尔表达式,其计算结果为1(如果51确实小于或等于j),否则为0.0和1均小于55,因此表达式结果始终为1(真).

要使它做你想做的事,你必须明确地将其转换为

(51 <= j) && (j <= 55)
Run Code Online (Sandbox Code Playgroud)

其他语言(如Python)能够对这种表达形式产生更"人性"的感觉,引入了链式比较的概念,它指定了如何将多个链式比较序列转换为单个比较的序列并在一起,但它是小窍门对于外界如何"经典"表达评估工作(以及可能 导致 惊喜).


顺便说一句,看起来您正在尝试使用浮点数来存储/操纵信用卡号码的16位数字.这是一个可怕的想法,因为double有53位的尾数,它略小于16位十进制精度.这意味着,对于"较大一侧"的信用卡号码,最后一位数字可能无法正确存储.更确切地说,每个信用卡号码超过9007 1992 5474 0992,最后一位数字将被修改并四舍五入为偶数.

所以,只需使用一个整数数组,你就可以避免令人讨厌的惊喜.

更一般地说,double如果您对数字的确切值感兴趣,请避免使用浮点数,除非您确切知道自己在做什么.