在以下代码中:
int main() {
int i, j;
j = 10;
i = (j++, j+100, 999+j);
cout << i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出为1010。
但是,它不应该是 1009,就像++在使用整个表达式之后应该做的那样吗?
代码
#include<iostream>
int main()
{
int a=3;
a++=5;
std::cout<<a;
}
Run Code Online (Sandbox Code Playgroud)
输出(如预期)
[Error] lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
1.后增量运算符 ( a++) 在表中具有最高优先级。所以它肯定会在赋值运算符 ( =)之前执行。并且根据后增量规则,变量的值a只有在执行该语句后才会增加。
那么当后增量运算符 ( ++) 在赋值运算符 ( =)之前执行时究竟会发生什么?
2. 在C 中,前自增运算符和后自增运算符都产生右值,但C++将前自增运算符更新为左值,同时将后自增运算符仅保留为右值。原因是我们不能让它成为左值,因为它只有旧值,而不是更新的值。但我不能正确理解这个原因。
现在a++看到右值是 3,而不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?
我最近问的问题是返回x ++的行为; 界定?
结果是关于我的预期,但让我想到了类似的情况.
如果我要写
class Foo
{
...
int x;
int& bar() { return x++; }
};
Run Code Online (Sandbox Code Playgroud)
bar现在返回int引用,是否定义了此行为?如果上一个问题的答案确实是真的,而不仅仅是对正在发生的事情的方便抽象,那么看起来你会返回一个堆栈变量的引用,一旦执行返回就会被销毁.
如果它只是一个抽象,我有兴趣知道后增量实际上保证了什么行为.
我从未在实际代码中看到用于预增量和后增量的用例.我经常看到它们的唯一地方是谜题.
我的观点是,它引入了更多的混淆而不是有用.
这不能通过使用+ =来完成
y = x++
y = x
x += 1
programming-languages increment pre-increment post-increment
我写了以下代码:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
Run Code Online (Sandbox Code Playgroud)
代码的输出是这样的:
01
1
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释第一行输出?为什么0和1都被打印?
我成功完全重载了一元++,--postfix /前缀运算符,我的代码工作正常,但在使用(++obj)++语句时,它返回意外的结果
这是代码
class ABC
{
public:
ABC(int k)
{
i = k;
}
ABC operator++(int )
{
return ABC(i++);
}
ABC operator++()
{
return ABC(++i);
}
int getInt()
{
return i;
}
private:
int i;
};
int main()
{
ABC obj(5);
cout<< obj.getInt() <<endl; //this will print 5
obj++;
cout<< obj.getInt() <<endl; //this will print 6 - success
++obj;
cout<< obj.getInt() <<endl; //this will print 7 - success
cout<< (++obj)++.getInt() <<endl; //this will print 8 …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关参考文献的维基百科页面.
它包含以下代码:
int& preinc(int& x)
{
return ++x; // "return x++;" would have been wrong
}
preinc(y) = 5; // same as ++y, y = 5
Run Code Online (Sandbox Code Playgroud)
我确实尝试使用return x++;而不是编译return ++x;.正如预测的那样,这导致了以下错误:
错误:从'int'类型的临时类型初始化'int&'类型的非const引用
我不明白这个错误.我有一种模糊的直觉,即x的增量发生得太晚(即,在preinc的函数调用结束后).但是,我不知道这是一个什么问题,因为变量x永远不会存在.欢迎任何解释.
array.prototype.reduce函数位于:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
它有以下循环:
for (index = 0; length > index; ++index) {
if (this.hasOwnProperty(index)) {
if (isValueSet) {
value = callback(value, this[index], index, this);
} else {
value = this[index];
isValueSet = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不认为索引在这里是先增加还是后增加,因为它是在每次循环迭代之后完成的,但是想要确定.
可以将其更改为index + = 1,以便传递jslint吗?请不要讨论jslint警告的优点.
这种变化会有什么不同吗?
我在java中有以下代码
int x=5;
System.out.println(x++ + ++x);
Run Code Online (Sandbox Code Playgroud)
输出是12.
我以为它应该是11.
我们这里有三个运营商:
+ 加成++ (POST)++ (预)上面的print语句以哪种顺序编译?
如果我写int x=5;,然后++x,做x==6或x==5我没有写x=++x.新值是否存储在x中?
寻找一种方法来记住Java或.NET中的运算符优先级,就像我们有DMAS一样.这也是他们的任何类比吗?
前几天我在我们的一个C++应用程序中遇到了一个奇怪的拼写错误,触发了代码进入无限循环.在for循环结束时i++,程序员意外地分配,而不是仅仅递增i = i++.
for (int i = 0; i < 10; i = i++) {
cout << "i = " << i << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
i = 0
i = 0
i = 0
...
Run Code Online (Sandbox Code Playgroud)
最奇怪的是,即使理解这是一个错字,我也看不出为什么这段代码不起作用.据我所知,分配i应该没有影响,因为i在分配后仍应增加.(出于某种原因,它必须改为复制一份?但这似乎没有意义.)
另一个有趣的事情是将赋值更改为i = ++i不会产生无限循环.
这段代码在我们之前的编译器中没有产生无限循环:gcc version 4.4.7 20120313.我们最近升级到gcc version 4.8.5 20150623现在它.
问题是为什么这个代码在逻辑上看起来不应该产生无限循环,哪个编译器根据C++标准正确解释这个?