说我有以下功能:
int foo()
{
return 1234;
}
调用此函数而不将其返回值赋给任何变量有什么影响:
foo();
使用运算符而不将其返回值赋给任何变量的效果是什么:
1 + 2 + 3;
答案 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寄存器。