当我调用函数而不将其返回值赋给变量时会发生什么?

时间:2015-01-25 21:56:27

标签: c++

说我有以下功能:

int foo()
{
    return 1234;
}

调用此函数而不将其返回值赋给任何变量有什么影响:

foo();

使用运算符而不将其返回值赋给任何变量的效果是什么:

1 + 2 + 3;

4 个答案:

答案 0 :(得分:5)

在C ++中,表达式是一个有效的语句;简单地丢弃计算出的值。

如果代码看起来很奇怪,有些编译器会足够智能地通知您一个警告;例如:

foo(1,2,3);

可以有意义(调用可能有副作用的函数)但代码如

x < 3;

没用,因为它没有定义的副作用,并且该值被丢弃。

在g ++中,还有一些库函数,尽管有副作用,但是特别标记为忽略返回值会引发警告(如fread),因为它是等待咬的bug的标志。

还有一些非常常见的情况,即频繁地忽略函数的结果(如printf),并且返回值的表达式仅用于副作用(如std::cout << "Hello"; )。

如果你想在运行时强制执行函数的结果而没有被忽略,那么有时可以使用一些技巧:

template<typename T>
struct must_check {
    T x;
    bool checked;
    must_chec(const T& x) : x(x), checked(false) {}
    operator T () { checked = true; return x; }
    ~must_check() {
        if (!checked)
          throw std::runtime_error("Result value has not been checked");
    }
};

现在而不是写

int square(int x) {
    return x * x;
}

写一下

must_check<int> square(int x) {
    return x * x;
}

然后编码

square(12);

将在运行时抛出异常,而

int result = square(12);

会正常工作。

这是可能的,但不是一个好主意,因为在析构函数中抛出异常是一种非常糟糕的行为,通常会导致程序异常终止(原因是有时析构函数会因异常而自动调用,在该阶段抛出另一个异常是一种致命的举动。)

答案 1 :(得分:1)

将评估操作或功能并继续运行。根据您的编译器,您可能会看到警告但是否则会继续运行而没有问题。

答案 2 :(得分:0)

您没有义务在C ++中使用函数的返回值执行任何操作。您可以调用函数并简单地忽略返回的值。运算符也是函数,因此你可以调用它,然后表达式将被再次评估 - 结果可能会被遗忘。

答案 3 :(得分:0)

在低级别,当函数返回值时,该值被复制到eax(在32位机器上)或rax(64位机器)寄存器中,然后调用函数使用eax或rax寄存器来读取返回的数据。 在这种情况下,调用函数只是不读取eax / rax寄存器。