在编程类,教授教我们关于x++和++x,其中x是一个整数.
他说,在方案中,我们可以只是把两种x++或++x,++x是更有效的(一点,但还是在理论上,更高效尽管如此).
但我忘记了原因.有谁知道?这是Java.
确切重复:在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) 关于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) 我有一些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".
是什么区别i = ++i;,并++i;在那里i与值的整数10?
根据我的说法i,两个表达式完成后,两者都做同样的增量工作i =11.
我刚刚在Javascript中遇到了关于预增量的'功能'.在我使用的所有其他语言中,它就像我认为的那样.例如在C++中:
#include <iostream>
int main()
{
int i = 0;
i += ++i;
std::cout << i << std::endl; // Outputs 2.
}Run Code Online (Sandbox Code Playgroud)
因此,++i不会复制变量,因此输出为2.
在PHP中相同:
<?php
$i = 0;
$i += ++$i;
echo $i; // Outputs 2.
Run Code Online (Sandbox Code Playgroud)
但是,在Javascript中:
var i = 0;
i += ++i;
console.log(i); // Outputs 1.
Run Code Online (Sandbox Code Playgroud)
所以它看起来像在Javascript中,它复制i并且不引用变量.这是故意的,如果是,为什么?
假设我有一个如下定义的结构
struct my_struct
{
int num;
};
Run Code Online (Sandbox Code Playgroud)
....
这里我有一个指针my_struct,我想做一个增量num
void foo(struct my_struct* my_ptr)
{
// increment num
// method #1
my_ptr->num++;
// method #2
++(my_ptr->num);
// method #3
my_ptr->++num;
}
Run Code Online (Sandbox Code Playgroud)
这三种递增方式是否num做同样的事情?虽然我们正处于这种状态,但预增量是否比后增量更有效?
谢谢!
(注意:我不是在询问预增量与后增量的定义,或者它们在C/C++中的使用方式.因此,我不认为这是一个重复的问题.)
C的开发人员(Dennis Ritchie等人)出于很好的理由创建了增量和减量运算符.我不明白为什么他们决定创造前后增量/减量的区别?
我的感觉是,当C开发时,这些运算符比今天更有用.大多数C/C++程序员使用其中一种,而来自其他语言的程序员今天发现这种区别奇怪且令人困惑(注意:这完全基于轶事证据).
他们为什么决定这样做,以及计算上发生了什么变化,这种区别今天没那么有用?
为了记录,可以在C++代码中看到两者之间的差异:
int x = 3;
cout << "x = 3; x++ == " << x++ << endl;
cout << "++x == " << ++x << endl;
cout << "x-- == " << x-- << endl;
cout << "--x == " << --x << endl;
Run Code Online (Sandbox Code Playgroud)
将作为输出
x++ == 3
++x == 5
x-- == 5
--x == 3
Run Code Online (Sandbox Code Playgroud) pre-increment ×10
c ×4
c++ ×4
java ×4
increment ×2
decrement ×1
javascript ×1
lvalue ×1
operators ×1
performance ×1
struct ×1