【问题标题】:how subtraction of two strlen() function works [duplicate]两个strlen()函数的减法如何工作[重复]
【发布时间】:2018-08-29 17:03:19
【问题描述】:

为什么这个程序会打印较短的字符串 ("paid")?

#include <stdio.h>
int main()
{
    char s[] = "paid", t[] = "paviDboss";
    if ((strlen(s) - strlen(t)) > 0)
        printf("%s\n", s);
    else
        printf("%s\n", t);
}

【问题讨论】:

  • 这段代码有什么问题?
  • main 不返回任何内容。
  • size_t 是无符号的,所以差值不能
  • @Osiris main 不必显式返回任何内容,它是唯一返回豁免值的函数。
  • @WeatherVane 我的意思是,如果size_t 映射为unsigned short,则可以对减法的结果进行签名,并且unsigned short 的所有值都可以在int 中表示,那么这就是整数促销将他们带到。 C 标准中没有任何内容说它不能是 unsigned short - 相反,唯一说的是它不应该大于 unsigned long 除非必要时

标签: c


【解决方案1】:

strlen 的返回类型是size_t,它是一个无符号类型。减法的结果也是size_t,因此只能是正数。

随便用

if(strlen(s) > strlen(t))

【讨论】:

  • 是的,我知道这会起作用,但我必须知道为什么 -5>0 条件不起作用
  • @Pavi 正如所说,因为类型是无符号的,所以减法的结果不能为负。无符号整数只能在0UINT_MAX 的范围内。
  • @Pavi 因为左侧实际上没有 -5。由于结果未签名,您可能有 2^64 - 5。
  • 这里不是UINT_MAX,而是SIZE_MAX
  • @AnttiHaapala 是的,应该是 size_t 而不是 unsigned intSIZE_MAX 而不是 UINT_MAX
猜你喜欢
  • 2013-11-30
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2011-07-14
  • 2017-10-19
相关资源
最近更新 更多