首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么(positive_integer < negative_integer)被评估为真?

为什么(positive_integer < negative_integer)被评估为真?
EN

Stack Overflow用户
提问于 2015-12-27 13:40:46
回答 4查看 69关注 0票数 1
代码语言:javascript
运行
复制
$ gcc --version  
gcc (Debian 4.9.2-10) 4.9.2

在下面的代码片段中,为什么将表达式100 < strlen(str) - 4计算为true?

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[50];

    scanf("%s", str);
    printf("%d\n", strlen(str) - 4);

    if(100 < (strlen(str) - 4))
        printf("NOT POSSIBLE!\n");

    return 0;
}

航站楼:

代码语言:javascript
运行
复制
$ gcc so.c -o so  
$ ./so  
foo
-1
NOT POSSIBLE!  

从实验中我发现:

  1. if表达式对于任何positive_int、negative_int对计算为true,例如positive_int < negative_num (这是荒谬的),其中negative_int以strlen函数调用的形式存在(参见2)。
  2. 如果我们用硬编码的负整数替换strlen,那么if将按预期计算为false。看来strlen有什么问题。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-27 13:42:36

由于strlen的类型为size_t,将4转换为(无符号) size_t,然后从strlen的返回值中扣除,然后将结果与100进行比较。

6.3.1.8通常的算术转换 …… 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换秩类型的操作数将转换为级别较大的操作数类型。 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。 7.24.6.3斯特伦函数 …… size_t strlen(const char *s); 7.19通用定义 …… size_t,它是sizeof运算符结果的无符号整数类型;

顺便说一句,即使在更简单的情况下,

代码语言:javascript
运行
复制
if (strlen("") < -1)
    printf("OK\n");
else
    printf("NOK\n");

,输出为OK

票数 4
EN

Stack Overflow用户

发布于 2015-12-27 13:43:13

strlen()将返回一个无符号值,因此strlen(str) - 4将是“非常大”的无符号数字,并且它将大于100

如果您不处理非常长的字符串,请尝试将返回值转换为int

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[50];

    scanf("%49s", str); /* specify size to avoid buffer overrun */
    printf("%d\n", (int)strlen(str) - 4);

    if(100 < ((int)strlen(str) - 4))
        printf("NOT POSSIBLE!\n");

    return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2015-12-27 13:43:31

strlen返回类型为size_t的无符号整数。当从无符号3中减去4时,无符号整数将换到最大可表示的数字,因此总是大于100。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34480975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档