【问题标题】:What kind of syntax is (round)(myFloat) in C?C 中的 (round)(myFloat) 是什么样的语法?
【发布时间】:2020-02-18 17:42:32
【问题描述】:

编辑:为之前的混乱道歉。

我遇到了一个类似

的代码示例
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int main(int argc, char *argv[])
    {
        int num = (round)(3.14*2 / 1.618);
        printf("test %d test", num);

        int num2 = (round)(3.0 / 2.0);
        printf("test %d test", num2);
    }

这个(圆形)有什么作用?这是对 math.h 中 round 函数的函数调用吗?这是否意味着我在(圆形)指针的位置有效地调用了一个函数?这是否意味着 (myFun+1)(myVar) 在某些情况下可以工作?

【问题讨论】:

  • 某处,您应该可以找到typedef .... round; 显示该代码的详细信息。 round 可能是在某处定义的函数指针。
  • 它可能会强制调用函数而不是扩展宏。
  • 我不知道这个,但是(printf)("abc\n"); 使用 MSVC 编译和运行。
  • @WeatherVane (*printf)("abc\n"); 也应该可以正确编译和运行。
  • @IanAbbott 甚至(*************printf)("abc\n");

标签: c


【解决方案1】:

在包含&lt;math.h&gt; 的情况下,round 是一个标准的 C 语言,将其参数四舍五入为最接近的整数,从零开始四舍五入,并返回 double

从技术上讲,round 是一个函数指示符:它表示函数。 (round) 只是括号中的指示符。与其他带括号的表达式一样,它的类型和值与其中的表达式相同。所以,在功能上,(round)round 相同,(round)(3.14*2 / 1.618)round(3.14*2 / 1.618) 相同

一个区别是&lt;math.h&gt; 可以将round 实现为类似函数的宏。在这种情况下,在round(x) 中,宏被扩展,结果表达式可能不是函数调用,也可能调用具有不同名称的函数。 (C 标准要求结果与调用 round 函数时的结果相同。)在 (round)(x) 中,宏名称 round 不紧跟左括号,因此函数的扩展 -像宏不会发生。因此(round)(x) 调用实际函数,即使定义了类似函数的宏。

关于将函数名称放在括号中以抑制宏扩展的这种行为是 C 库的一个故意功能(C 2018 7.1.4 1:“...... 函数的任何宏定义都可以通过封闭函数的名称来在本地抑制在括号内,…”)。但是,没有明显的理由在此代码中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2017-04-13
    • 2010-09-22
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多