确切重复:在C++中i ++和++ i之间是否存在性能差异?
确切重复:循环中i ++和++ i之间的区别?
什么更有效,i ++或++ i?
我只在Java和C/C++中使用过这个,但我真的要求实现它的所有语言.
在大学里我有一位教授告诉我们++我更有效率,但已经有几年了,我想从Stack Overflow社区获得意见.
我对post ++和pre ++运算符感到困惑,例如在下面的代码中
int x = 10;
x = x++;
sysout(x);
Run Code Online (Sandbox Code Playgroud)
会打印10?
它打印10,但我预计它应该打印11
但是当我这样做的时候
x = ++x; instead of x = x++;
Run Code Online (Sandbox Code Playgroud)
它将按照我的预期打印11个,那么为什么x = x ++; 不改变x的值?
让我们考虑以下代码:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
编译时出现以下错误:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来很公平。后缀增量的优先级高于前缀增量的优先级,因此代码被解析为int b = ++(i++);,i是右值。因此,错误。
现在让我们考虑带有括号的此变体,以覆盖默认优先级:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
该代码将编译并返回3。对我来说,这听起来很公平,但似乎与第一个代码矛盾。
问题:为什么(++i)是lvalue当i不成?
谢谢!
更新:上面显示的错误消息来自gcc(x86-64 9.2)。这是确切的渲染: gcc错误
Clang x86-64 9.0.0有一个完全不同的消息: clang错误
<source>:3:13: error: expression is …Run Code Online (Sandbox Code Playgroud) 我无法通过joshua bloch的"java puzzlers"来制作以下代码的正面或反面.
public class Test22{
public static void main(String args[]){
int j=0;
for(int i=0;i<100;i++){
j=j++;
}
System.out.println(j); //prints 0
int a=0,b=0;
a=b++;
System.out.println(a);
System.out.println(b); //prints 1
}
}
Run Code Online (Sandbox Code Playgroud)
我不能得到j打印0的部分.据作者说,
j=j++
Run Code Online (Sandbox Code Playgroud)
类似于
temp=j;
j=j+1;
j=temp;
Run Code Online (Sandbox Code Playgroud)
但
a=b++
Run Code Online (Sandbox Code Playgroud)
制作b 1.所以它应该像这样评估,
a=b
b=b+1
Run Code Online (Sandbox Code Playgroud)
遵循相同的逻辑,不应该
j=j++
Run Code Online (Sandbox Code Playgroud)
被评估为,
j=j
j=j+1
Run Code Online (Sandbox Code Playgroud)
这里的温度在哪里?任何解释都将非常感激."我对此深有所怀疑.;)>>提前致谢.
关于Java中的运算符优先级,我有两个类似的问题.
第一:
int X = 10;
System.out.println(X++ * ++X * X++); //it prints 1440
Run Code Online (Sandbox Code Playgroud)
根据Oracle教程:
postfix(expr ++,expr--)运算符的优先级高于prefix(++ expr, - expr)
所以,我想评估顺序:
1) first postfix operator: X++
1.a) X++ "replaced" by 10
1.b) X incremented by one: 10+1=11
At this step it should look like: System.out.println(10 * ++X * X++), X = 11;
2) second POSTfix operator: X++
2.a) X++ "replaced" by 11
2.b) X incremented by one: 11+1=12
At this step it should look like: System.out.println(10 * ++X …Run Code Online (Sandbox Code Playgroud) 为什么这段代码总能产生x=2?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
Run Code Online (Sandbox Code Playgroud) 在示例代码中,我经常看到代码,例如*it++输出迭代器.表达式*it++复制it,递增it,然后返回最终解除引用的副本.据我了解,制作输出迭代器的副本会使源无效.但是it,在创建副本之后执行的增量将是非法的,对吧?我对输出迭代器的理解有缺陷吗?
我正在对一些代码进行审查,并且遇到了一个有人在增加一个成员变量的实例,该成员变量是一个围绕Integer的包装类.我亲自尝试过,真的很惊讶它有效.
Integer x = 0;
System.out.print(x++ + ", ");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)
这打印出来0, 1,不像0, 0 我预期的那样.我查看了语言规范,找不到任何涉及此内容的内容.任何人都可以向我解释为什么它可以工作,如果它在多个平台上是安全的?我原本以为这会分解成
Integer x = 0;
int temp1 = x.intValue();
int temp2 = temp1 + 1;
System.out.println(temp1);
temp1 = temp2;
System.out.println(x.intValue());
Run Code Online (Sandbox Code Playgroud)
但显然规范中有些东西会在x = temp1;最后一行之前添加
我有一些C代码:
main()
{
int a=1;
void xyz(int,int);
xyz(++a,a++); //which Unary Operator is executed first, ++a or a++?
printf("%d",a);
}
void xyz(int x,int y)
{
printf("\n%d %d",x,y);
}
Run Code Online (Sandbox Code Playgroud)
该函数xyz有两个传入的参数,++a和a++.有人可以解释操作顺序来解释结果吗?
上面的代码根据使用的编译器打印"3 13"或"2 23".
表达式1:*p++;where p是指向整数的指针.
p将首先递增,然后由于关联性(从右到左)获取它指向的值.这样对吗?
表达式2:a=*p++;where p是指向整数的指针.
首先取值,p然后分配给a第一个然后p由于后增量而增加.这样对吗?
post-increment ×10
java ×5
c ×3
c++ ×3
immutability ×1
increment ×1
iterator ×1
lvalue ×1
operators ×1
performance ×1
pointers ×1
stl ×1