$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2在下面的代码片段中,为什么将表达式100 < strlen(str) - 4计算为true?
#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;
}航站楼:
$ gcc so.c -o so
$ ./so
foo
-1
NOT POSSIBLE! 从实验中我发现:
if表达式对于任何positive_int、negative_int对计算为true,例如positive_int < negative_num (这是荒谬的),其中negative_int以strlen函数调用的形式存在(参见2)。strlen,那么if将按预期计算为false。看来strlen有什么问题。发布于 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运算符结果的无符号整数类型;
顺便说一句,即使在更简单的情况下,
if (strlen("") < -1)
printf("OK\n");
else
printf("NOK\n");,输出为OK。
发布于 2015-12-27 13:43:13
strlen()将返回一个无符号值,因此strlen(str) - 4将是“非常大”的无符号数字,并且它将大于100。
如果您不处理非常长的字符串,请尝试将返回值转换为int。
#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;
}发布于 2015-12-27 13:43:31
strlen返回类型为size_t的无符号整数。当从无符号3中减去4时,无符号整数将换到最大可表示的数字,因此总是大于100。
https://stackoverflow.com/questions/34480975
复制相似问题