2015-01-26 79 views
0

为什么可接受写以下代码,为什么我们不能一步一步输入和操作?

int x = foo();//some random value is assigned 
cout << --x; 

其中x在同一行输出突变,但下面的代码是不?

int x = foo();//some random value is assigned 
cin >> x--; 

是否有另一种方法来抓取输入并在一个步骤中减少它?

+1

由于大致相同的原因,你可以写'y = -x;'而不是'x-- = y;'。与输入无关。 – 2015-01-26 22:12:13

+4

除非你输入一个混淆的编码比赛 - 你为什么要? – John3136 2015-01-26 22:13:14

+0

当然,为什么不呢? 'cin >> x,x - ;' – deniss 2015-01-26 22:19:25

回答

2

内置前缀增量和减量运算符返回左值。后缀增量和减量运算符返回prvalues。输入流的提取操作符(operator>>())需要一个可修改的左值作为其操作数。

内置前缀运营商:

A& operator++(A&) 
bool& operator++(bool&) (deprecated) 
P& operator++(P&) 
A& operator--(A&) 
P& operator--(P&) 

内置后缀运算符:

A operator++(A&, int) 
bool operator++(bool&, int) (deprecated) 
P operator++(P&, int) 
A operator--(A&, int) 
P operator--(P&, int) 

所以这应该编译:

std::cin >> --x; 

但不是这样的:

std::cin >> x--; 

但下降幅度会发生之前曾经进行输入。你实际上不能读入一个变量,然后在一个表达式中减少它的值。你最好把它分成两部分:

std::cin >> x; 
--x; 
+0

[对我不适用](http://coliru.stacked-crooked.com/a/bffc486130ea9b98)。或者我误解了你的答案? – 2015-01-26 22:26:45

+0

@BaummitAugen对这个例子不起作用的是什么?它看起来正在做它应该做的。 – 0x499602D2 2015-01-26 22:28:04

+0

OP希望“一步抓取输入和递减”。这只是照原样输入,不是吗? 'std :: cin >> x'甚至没有任何区别。 – 2015-01-26 22:29:48