gpt4 book ai didi

c - 32 位和 64 位系统中的 strcmp 行为

转载 作者:行者123 更新时间:2023-12-04 02:39:15 24 4
gpt4 key购买 nike

以下代码片段在 32 位和 64 位操作系统中的行为不同。

char *cat = "v,a";
if (strcmp(cat, ",") == 1)
...

上述条件在 32 位中为真但在 64 位中为假。我想知道为什么这是不同的?32 位和 64 位操作系统都是 Linux (Fedora)。

最佳答案

strcmp()如果参数 1 在参数 2 之前,则函数仅定义为返回负值,如果它们相同则返回零,或者如果参数 1 在参数 2 之后返回正值。

不保证返回的值将是 +1。或 -1随时。基于该假设的任何相等性测试都是错误的。可以想象,strcmp() 的 32 位和 64 位版本为给定的字符串比较返回不同的数字,但查找 +1 的任何测试来自 strcmp()存在固有缺陷。

您的比较代码应该是以下之一:

if (strcmp(cat, ",") >  0)    // cat >  ","
if (strcmp(cat, ",") == 0) // cat == ","
if (strcmp(cat, ",") >= 0) // cat >= ","
if (strcmp(cat, ",") <= 0) // cat <= ","
if (strcmp(cat, ",") < 0) // cat < ","
if (strcmp(cat, ",") != 0) // cat != ","

注意共同的主题——所有测试都与 0 进行比较。您还会看到人们写道:

if (strcmp(cat, ","))   // != 0
if (!strcmp(cat, ",")) // == 0

就个人而言,我更喜欢与零进行显式比较;我在心里将速记翻译成适当的速记(并且讨厌被迫这样做)。


请注意 strcmp() 的规范说:

ISO/IEC 9899:2011 §7.24.4.2 The strcmp function

¶3 The strcmp function returns an integer greater than, equal to, or less than zero, accordingly as the string pointed to by s1 is greater than, equal to, or less than the string pointed to by s2.

它没有提到 +1-1 ;您不能依赖结果的大小,只能依赖它的符号(或者当字符串相等时它为零)。

关于c - 32 位和 64 位系统中的 strcmp 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com