案例是我正在研究我在互联网上找到的引起我注意的代码,是这样的:
#include <stdio.h>
#include <stdint.h>
#define NEG ~0x0LL
void ITOC(int8_t *vec, int n)
{
int8_t *p = vec;
for(; n; n /= 10) *p++ = n % 10;
}
void ncmp(int8_t *buf, int y)
{
int tmp, i = 0;
for (; y ; y/=10)
{
tmp = y % 10;
for(i = 0; i < 8; i++)
if(buf[i] == tmp && buf[i] != -1)
{
buf[i] = -1;
break;
}
}
}
int main(void)
{
int8_t buf[8];
int y = 21 ,z = 60, n = 1260;
*((uint64_t*) buf) = NEG;
ITOC(buf, n);
ncmp(buf, y);
ncmp(buf, z);
if( *((uint64_t*) buf) == NEG )
printf("%d = %d * %d\n", n, y, z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
部分我不明白这一行:
if( *((uint64_t*) buf) == NEG )
Run Code Online (Sandbox Code Playgroud)
如果变量具有以下值:
y = 21 z = 60 n = 1260
Run Code Online (Sandbox Code Playgroud)
条件为真,但如果这些值包含:
y = 18 z = 81 n = 1458
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第一个位置buf是-1,如果if仅比较第一个位置和NEG也应该为真.
有人能解释会发生什么吗?
我不知道你在哪里找到这个代码,但它肯定不会做你认为它做的.
你认为它做的是检查某种乘法.可能是因为它最后打印了"n = y*z".但是,它实际上是需要的数字n,并删除的数字y和z.如果删除了所有数字,则会打印该消息.例如:
1111 = 11 * 11 true
1234 = 12 * 34 true
1500 = 10 * 50 true
1500 = 30 * 50 false
1458 = 18 * 81 false
1458 = 14 * 58 true
1458 = 45 * 18 true
Run Code Online (Sandbox Code Playgroud)