【问题标题】:C/C++: char() used as a functionC/C++:char() 用作函数
【发布时间】:2014-06-25 18:23:04
【问题描述】:

我最近遇到了以下代码,它使用了我以前从未见过的语法:

std::cout << char('A'+i);

代码的行为很明显:它只是将一个字符打印到标准输出,其值由 ASCII 表中的“A”位置加上计数器 i 的值给出,计数器 i 的类型为 unsigned int。

例如,如果 i = 5,则上面的行将打印字符“F”。

我以前从未见过将 char 用作函数。我的问题是:

  1. 此功能是 C++ 特有的还是在严格的 C 中已经存在?
  2. 是否有将 char() 关键字用作函数的技术名称?

【问题讨论】:

    标签: char


    【解决方案1】:

    那是 C++ 强制转换语法。以下是等价的:

    std::cout << (char)('A' + i); // C-style cast: (T)e
    std::cout << char('A' + i);   // C++ function-style cast: T(e); also, static_cast<T>(e)
    

    Stroustroup 的 C++ 编程语言(第 3 版,第 131 页)调用第一种类型 C 样式转换,以及第二种类型函数样式转换。在 C++ 中,它等价于 static_cast&lt;T&gt;(e) 表示法。 C 中不提供函数样式转换。

    【讨论】:

    • 感谢您的解释。我的下一个问题是拥有多种类型的演员表的目的是什么。看来我还有一些研究要做。这是一个相关的问题/答案,我将从以下内容开始阅读:stackoverflow.com/questions/4474933/…
    • Stroustroup 先生(C++ 的创建者)不喜欢 C 风格的演员表——这当然很危险,因为它的效果在很大程度上取决于它转换的内容;也就是说,从简单的检查来看,很难知道将发生的确切转换。于是他添加了几个函数风格的变种,包括this question中的所有类型
    【解决方案2】:

    这不是函数调用,而是类型转换。更常见的是写成

    std::cout << (char)('A'+i);
    

    这清楚地表明它不是函数调用,但您的版本也是如此。请注意,您的版本可能仅在 C++ 中有效,而上述版本在 C 和 C++ 中均有效。在 C++ 中,您还可以更明确地编写

    std::cout << static_cast<char>('A'+i);
    

    相反。 并不是说强制转换是必要的,因为'A'+i 将具有int 类型并打印为整数。如果您希望将其解释为字符代码,则需要 char 演员表。

    【讨论】:

    • 我的 K&R 的“C 编程语言”副本坚持只能通过 (type)value 执行强制转换,并且根本没有描述 type(value) 语法。因此,我认为它是一个 C++ 扩展。
    • @tucuxi,你可能是对的,编辑反映。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2020-05-09
    • 1970-01-01
    • 2010-11-25
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多