为什么-i++和-(i++)不同?为什么结果如下
Why is -i++ and -(i++) different ? Why is the result as follows?
可能重复:
使用std::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++(的错误,不知何故
目前,您的代码有未定义的行为。您既使用i
的值,又修改i
,而不需要插入序列点1。这会产生未定义的行为。
两行之间结果的差异并非源于括号的使用——它纯粹源于第一行中的++
修改了i
的值,因此当您到达第二行时,其值已递增。
总之,由于您有未定义的行为,任何输出都是完全合理和允许的,但-4 4 -3 3
是非常合理和可理解的。
- 从C++11开始,该标准不再使用短语"序列点",而是使用"在之前排序"或"在之后排序"等短语来描述相同的基本意图。一些的东西最终从这次更改中得到了定义的行为,但并不多(特别是,没有这个代码(
这两行是同一
尝试
int i = 3;
cout << - i++ << endl << i << endl;
i=3
cout << -(i++) << endl << i << endl;
任何操作员的操作员优先级可在此处找到:
http://en.cppreference.com/w/cpp/language/operator_precedence
并且,后缀++(您使用的后缀(的优先级高于一元加号和减号。
另一方面,你应该阅读这个问答:
为什么a=i+i++是未定义的,而不是未指定的行为
你的例子实际上与此相同:
(
(
(
cout.operator<<(-(i++))
).operator<<(endl)
).operator<<(i)
).operator<<(endl);
本质上,修改一个变量并在同一表达式中使用它通常是未定义的行为:程序可以执行任何操作。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么在递归中使用循环会产生意想不到的结果?
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 当关系运算符的含义相同时,为什么结果不同?
- 为什么结果为 0
- 谁能告诉我为什么结果是 7 7 7 而不是 7 7 10
- 为什么结果如此不同
- 如果在 SQUARE 宏中传递前缀变量,为什么结果会有所不同
- 不知道为什么结果会这样?我期望 15 50 5
- 为什么 2 + 1 & 0 结果为 0?
- 当我减去内存地址时,为什么结果比我预期的要小?
- 为什么结果没有写在文本文件上?
- 为什么结果不在我的期望中
- 为什么结果输出为 1
- 为什么-i++和-(i++)不同?为什么结果如下