【发布时间】:2019-07-09 17:30:24
【问题描述】:
我有这些奇怪的行为。 如果我使用下面的代码
class Simple
{
public:
Simple()
{
m = 1;
mm = 2;
mmm = 3;
}
~Simple()
{
}
private:
int mmm;
int mm;
int m;
};
int main(int argc, char** argv)
{
Simple sim;
printf("%d\n", sim);
}
由于 printf 的结果,我有数字“3”。 如果我首先放入声明,例如,变量“mm”而不是“mmm”,则 printf 的结果是数字“2”。 如果我在声明中首先放入变量“m”,则行为相同,printf 给我“1”。 似乎 printf 可以打印声明的第一个 int 变量。怎么可能?
【问题讨论】:
-
俗话说,未定义的行为是未定义的。
-
请记住,当人们编写“未定义的行为”时,这意味着编程语言没有您正在研究的表达式的标准行为。这意味着每个编译器供应商都可以决定如何处理它。
-
@nicomp 编译器不必决定如何处理它。他们可以简单地假设 UB 永远不会发生,因为他们不必关心有 UB 时会发生什么。
-
未定义的行为可能发生任何事情,因此您必须习惯它。 C++ 和 C 旨在提高效率,因此在许多情况下,假设您知道自己在做什么,并且没有为您内置错误检查。当您导致未定义的行为时,不能保证您会收到错误,并且您的程序可能看起来工作正常。
-
下一次,使用
std::cout,从而学习如何为您的Simple类正确实现operator <<。