当我调用函数而不将其返回值分配给变量时会发生什么
What happens when I call a function without assigning its returned value to a variable?
假设我有以下函数:
int foo()
{
return 1234;
}
调用此函数而不将其返回值分配给任何变量的效果是什么:
foo();
另外,使用运算符而不将其返回值分配给任何变量的效果是什么:
1 + 2 + 3;
在C++表达式是有效的语句;计算的值被简单地丢弃。
一些编译器足够聪明,如果代码看起来很奇怪,它会通知您警告;例如:
foo(1,2,3);
可以有意义(调用可能有副作用的函数),但代码类似
x < 3;
没有用,因为它没有定义的副作用,并且该值被丢弃。
在 g++ 中,还有一些库函数尽管有副作用,但被特别标记,以便忽略返回值会引发警告(如 fread
),因为它是等待咬人的错误的标志。
还有一些非常常见的情况,其中经常忽略函数的结果(如printf
),并且返回值的表达式仅用于副作用(如std::cout << "Hello";
)。
如果要在运行时强制函数的结果未被静默忽略,则有时可以使用一个技巧:
template<typename T>
struct must_check {
T x;
bool checked;
must_check(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);
将正常工作。
这是可能的,但不是一个真正的好主意,因为在析构函数中抛出异常是一种非常糟糕的行为,通常会导致程序异常终止(原因是有时析构函数会因为异常而被自动调用,在该阶段抛出另一个异常是一个致命的举动)。
更新
C++17 引入了一个注释,以便丢弃的可疑返回值可以在编译时发出警告。例如代码
[[nodiscard]] double square(double x) {
return x*x;
}
如果未使用返回值,将在编译时触发警告。
将评估操作或函数并继续运行。根据您的编译器,您可能会看到警告,否则它将继续运行而不会出现问题。
在低级别,当函数返回值时,该值被复制到 eax(在 32 位机器上)或 rax(64 位机器)寄存器中,然后调用方函数使用 eax 或 rax 寄存器读取返回的数据。在这种情况下,调用方函数只是不读取 eax/rax 寄存器。
您没有义务对函数在 C++ 中的返回值执行任何操作。您可以调用函数并简单地忽略返回值。运算符也是函数,因此您可以调用它,然后表达式将被计算并再次 - 结果可能只是被遗忘。
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 未初始化的变量有什么危险
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 存储变量的更有效方法是什么?
- 变量 BitMask 在函数 CeilLog2 中的实际效果是什么?
- 这个变量在 C++ 中的范围是什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 变量按什么顺序相乘
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- C++在变量的内存地址上做什么来"deallocate"它?
- 有什么方法可以使用 int 变量来完成组件名称吗?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 正在连接的等待条件变量的线程会发生什么情况?
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 什么是变量均值'int border = borderType & ~BORDER_ISOLATED'?