在使用较新版本的GCC构建程序时,我在代码中发现了问题。
0x0
此代码适用于旧版GCC(2.95),但不适用于较新版本(4.8)。
因此,我怀疑此语句会导致不确定的行为,对吗?还是有一个更好的术语来解决这个问题?
答案 0 :(得分:1)
实际上,这是未定义的行为。
int i = 2;
i = i++; // is i assigned to be 2 or 3?
答案 1 :(得分:1)
实际上,这被指定为未定义的行为,因为每个编译器都定义了自己的操作顺序,具体说明如下:https://en.cppreference.com/w/cpp/language/eval_order
几乎所有C ++运算符的操作数求值顺序(包括函数调用表达式中的函数自变量的求值顺序以及任何表达式中子表达式的求值顺序)均未指定。编译器可以按任何顺序求值操作数,并且在再次求同一个表达式时可以选择其他顺序。
cppreference中的递增/递减页面上实际上有一个警告:https://en.cppreference.com/w/cpp/language/operator_incdec
由于存在副作用,因此必须谨慎使用内置的递增和递减运算符,以避免由于违反排序规则而导致不确定的行为。