2015-01-26 83 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