有什么区别
你能给我一些例子吗?
在C++中,预增量运算符给出左值,因为返回了递增的对象本身,而不是副本.但在C中,它给出了右值.为什么?
我刚刚了解到C++中前缀增量运算符的结果是左值.有可能这种行为有助于程序员更有效,但我想不到任何.前缀增量运算符的这种行为有哪些惯用的用法?
cout<<(x++)++; //fails
cout<<++(++x); //passes
Run Code Online (Sandbox Code Playgroud)
为什么后期增量失败?我看到它发生但不确定技术原因.
我刚刚阅读了关于前缀增量运算符的C引用,并意识到前缀增量运算符的结果不是左值,但令人惊讶的是它在C++中是左值.之后我读了这个答案,解释了为什么它是一个左值,但我不明白它:
(第3行):["]看起来它是这样你可以取其地址或分配给参考.[."]
以下是一个例子:
Run Code Online (Sandbox Code Playgroud)int i; extern void f (int* p); f (&++i); /* Would be illegal C, but C programmers havent missed this feature */ ...
那么允许这个有什么好处呢?i在全球范围内增加的唯一目的是非法的吗?如果这是我认为这可以解决C中缺陷(无法/难以解决)的唯一原因,或者为了可读性而应该重写程序,对吧?
顺便说一句我不明白为什么左值也被称为"定位器值",我读过这个 - 第4行,但定位器对我来说很模糊.什么是定位器,它是指针吗?
编辑:为了您宝贵的时间阅读关于wth是定位器值,这是我自制的backronym:
如果出了什么问题,不要怪我.
标题说的是什么.对于C++,(++a)++编译.但奇怪的是,++(a++)不是:
int main() {
int a = 0;
++a++; // does not compile
(++a)++; // does compile
++(a++); // does not compile
}
Run Code Online (Sandbox Code Playgroud)
但在Java中,并不是所有三个:
public class Test {
public static void main(String[] args) {
int a = 0;
++a++; // does not compile
(++a)++; // does not compile
++(a++); // does not compile
}
}
Run Code Online (Sandbox Code Playgroud)
有没有理由为什么C++编译它而不是Java?
可能重复:
为什么++ i被认为是l值,但i ++不是?
在C++(以及C语言)中,如果我写:
++x--
++(x--)
Run Code Online (Sandbox Code Playgroud)
我得到错误:左值作为增量操作数
然而(++x)--编译.我很迷惑.
我是C++的初学者.我的理解是: -
i ++首先执行,然后递增,++ i先递增,然后执行,i + = 1递增1,然后执行.但是在FOR循环中:
for (i=0;i<10;i++)
for (i=0;i<10;++i)
Run Code Online (Sandbox Code Playgroud)
上面这两个循环确实没有区别.
这是另一个计算从1到100的所有整数的总和:
int i=1, sum=0;
while (i<=100)
{
sum+=i;
i++; //i+=1; ++i;
}
cout<<sum<<" "<<i<<endl;
return 0;
Run Code Online (Sandbox Code Playgroud)
但是如果我用i + = 1或++ i替换i ++,它们都会返回5050和101的总和.所以我真的看不出它们有什么不同.
所以有人可以向我解释这个吗?编程中哪一个最常用?谢谢!!
为什么该代码由于错误而无法编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << ++(i++) << " " << i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然该代码确实编译:
#include <iostream>
using namespace std;
int main()
{
int i = 0;
cout << (++i)++ << " " << i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不明白这个.从我的观点来看,编译第一个块是非常合理的.表达式++(i ++)只是意味着取i,递增它并输出,然后再递增它.
我不是在询问int溢出中的未定义行为.在写这个问题时我根本不知道r和l值,我不在乎为什么++我被认为是l值,但i ++不是.
当我执行这个程序时:
#include<iostream>
using namespace std;
int main(){
int x=5,y=9;
if(++x=y++){
cout<<"Works "<<x;
}
else{
cout<<"No";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,输出是:Works 9
但如果我执行:
#include<iostream>
using namespace std;
int main(){
int x=5,y=9;
if(x++=y++){
cout<<"Works "<<x;
}
else{
cout<<"No";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它声明:在函数'int main()'中:6:11:错误:左值作为赋值的左操作数,如果(x ++ = y ++){