我现在已经知道了!这是负责'cout' 所有代码:
#include <iostream>
using namespace std;
int main()
{
int i = 3;
cout <<-i++<<endl<<i<<endl<<-(i++)<<endl<<i<<endl;
return 0;
}
我用VC ++ 6.0编译,输出是:-4 4 -3 3
但我用g ++编译,输出是:-4 5 -3 5
为什么?我认为它们应该是相同的:-4 4 -4 4
PS:我试试看:
int main()
{
int i = 3;
cout <<-i++<<endl;
return 0;
}
和
int main()
{
int i = 3;
cout <<-(i++)<<endl;
return 0;
}
我逐个编译它们,结果是一样的:-3 3 想想所有的答案,我可能会错误地测试-i ++和 - (i ++)某种方式
答案 0 :(得分:6)
就目前而言,您的代码具有未定义的行为。您都使用i
的值并修改i
而没有插入序列点 1 。这给出了未定义的行为。
两行之间的结果差异不源于括号的使用 - 它纯粹源于第一行中++
修改{的值的事实{1}},所以当你到达第二行时,它的值已经递增。
总而言之,由于您有未定义的行为,任何输出都是完全合理且允许的,但i
非常合理且易于理解。
答案 1 :(得分:1)
这两行是相同的
尝试
int i = 3;
cout << - i++ << endl << i << endl;
i=3
cout << -(i++) << endl << i << endl;
可在此处找到任何运算符的运算符优先级:
http://en.cppreference.com/w/cpp/language/operator_precedence
而且, postfix ++ (你使用的那个)的优先级高于一元加减。
另一方面,你应该阅读这个Q和A:
Why is a = i + i++ undefined and not unspecified behaviour
您的示例实际上与此相同:
(
(
(
cout.operator<<(-(i++))
).operator<<(endl)
).operator<<(i)
).operator<<(endl);
本质上,修改变量并在同一表达式中使用它通常是未定义的行为:允许程序执行任何。