后缀和前缀自增
Postfix and prefix increment
为什么下一段代码的输出是2 1 2
#include "iostream"
int main(int argc, const char *argv[])
{
int i = 0;
std::cout << i << std::endl << i++ << std::endl << ++i << std::endl;
return 0;
}
因为首先i
等于2但不为零,这意味着首先计算cout
的整个类然后打印出来(不是一部分一部分地)。如果是这样,那么第一个值应该是1,而不是2,因为i++
应该在打印后增加i
。你能澄清一下吗?
下一段代码的输出是2 2 0
。
#include "iostream"
int main(int argc, const char *argv[])
{
int i = 0;
std::cout << i << std::endl << ++i << std::endl << i++ << std::endl;
return 0;
}
为什么?
在你的代码输出中没有意义的推理,因为你的程序表现出未定义行为。
c++ 11标准第1.9/15段:
操作符操作数的值计算顺序在操作符结果的值计算之前。如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值进行的值计算是无序的,则该行为是未定义的。
由于没有序列点将i
的两个突变分开,因此发生未定义行为。你的编译器可能不输出任何东西,程序在不同的编译器上可能输出不同的结果。但是在这种情况下争论输出是不必要的。
如果你把语句分开,结果就会如预期的那样出来:
std::cout << i << std::endl; // 0
std::cout << i++ << std::endl; // 0
std::cout << ++i << std::endl; // 2
从右到左求值
i = 0
++i -> i = 1
i++ -> i = 1,递增后,复制发生。则I = 2
i -> i = 2
由于所有这些都发生在发送到cout之前,因此i的值为2,并且中间的值已被复制,其值为1。
如果我没有理解清楚你的问题,请告诉我:
cout << i++;
相当于
cout << i;
i+=1;
while cout << ++i
相当于
i += 1;
cout << i;
换句话说,任何时候你使用i++
,后增量它返回当前值,然后改变,而++i
意味着先增量,然后返回新值。它与cout
相关文章:
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 为什么 C++ 程序员更喜欢前缀 ++,而 Java 程序员更喜欢后缀 ++?
- 导致错误的后缀和前缀增量
- 为什么后缀增量比C 中的前缀更快
- C++编译器如何扩展前缀和后缀运算符++()?
- 指向重载前缀和后缀运算符中的类对象的指针
- C++如何知道在重载运算符时增量++是前缀或后缀
- 在一行C 中,该代码后缀和前缀的输出的逻辑是什么
- Android Cmake编译器正在生成带有额外前缀和符号后缀的.out文件
- 为什么后缀失败并且前缀在传递迭代器作为参数并在尾部位置递归时工作正常
- std::map<tuple<int,int>.lower_bound/upper_bound 前缀搜索,而不找到后缀的最小/最大元素
- 在迭代器上澄清后缀/前缀操作员
- 前缀和后缀运算符 C++
- 在哪里可以找到C++11类型前缀/后缀的列表
- 编译器如何翻译后缀/前缀运算符
- 为什么所有type_traits类都必须使用 'typename' 和'::type'前缀/后缀调用?
- 涡轮增压C++(非可视)(后缀和前缀运算符)
- ++ 后缀和前缀的起源
- C++运算符重载前缀/后缀
- 预结束/追加(前缀/后缀)行在GVim