【问题标题】:Why is function 'lower' has int as return type and input type?为什么函数'lower'有int作为返回类型和输入类型?
【发布时间】:2018-10-23 14:59:19
【问题描述】:
int main(void)
{
    char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i;

    i = 0;
    while (s[i] != '\0') {
        printf("%c -> %c\n", s[i], lower(s[i]));
        i++;
    }

    return 0;
}

int lower(int c)
{
    return (c >= 'A' && c<= 'Z') ? c + 'a' - 'A' : c;
}

这是将所有字母转换为小写的程序。所以在解决方案中他们使用了一个较低的函数,但我不知道他们为什么使用 int 作为返回类型。

【问题讨论】:

  • 我可能是错的,但我相信这是因为它会将其解释为 ASCII 码而不是字符
  • 因为在 C 中,字符文字并不是真正的char,而是int
  • 您是指islower 还是tolowerlower 有一个 return 类型的 int 因为你是这样写的。
  • 请注意,您的 lower 函数可能不适用于 C 官方支持的其他字符编码。
  • 请注意,lower() 作为intchar 的结果无论如何都会转换为int 作为... 的参数printf()

标签: c int


【解决方案1】:

为什么函数'lower'有int作为返回类型和输入类型?

  1. 代码完全是int数学。即使签名是char c,由于通常的整数提升,代码也会有int 结果。

    int lower(int c) {
      return (c >= 'A' && c<= 'Z') ? c + 'a' - 'A' : c;
    }
    
  2. 通常映射 257 个不同的值,例如 tolower()。对于int lower(char c) {c &lt; 0,它的功能可能与tolower() 不同。

  3. int 通常接近本机处理器整数大小,而intchar 相比,代码通常是最紧凑和最快的。这是C历史上的选择和妥协。包括原始 C 没有原型函数签名,所有int 和子int 参数都被提升为int

7.4 字符处理

标题&lt;ctype.h&gt; 声明了几个对分类和映射有用的函数 人物。在所有情况下,参数都是int,其值应为 可表示为unsigned char 或应等于宏EOF 的值。如果 参数具有任何其他值,则行为未定义。 C11dr §7.4 1

这些is...()to...() 函数在unsigned char range(和EOF)而不是char 中工作。

当调用tolower()tolower() 类函数时,健壮的代码将避免负的char

// printf("%c -> %c\n", s[i], lower(s[i]));
printf("%c -> %c\n", s[i], lower((unsigned char) s[i]));

【讨论】:

    【解决方案2】:

    它最有可能试图模仿使用 int 的 tolower 函数。

    在 tolower 上使用 int 的类似问题在这里。 Why putchar, toupper, tolower, etc. take a int instead of a char?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2015-11-02
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多