我从Java的官方教程中读到前缀和后缀++ - 具有不同的优先级:
后缀:expr ++ expr--
一元:++ expr --expr + expr -expr~!
根据教程,不应该这样
d = 1; System.out.println(d++ + ++d);
打印6(d++使d 2,++d使它3)而不是4?
我知道++d事先评估的解释,但如果d++有更高的优先权++d,为什么不d++首先评估?更重要的是,在什么情况下应该d++表明它具有更高的优先级?
编辑:
我尝试了以下方法:
d = 1; System.out.println(++d * d++);
它返回4.它似乎应该是2*2,而不是1*3.
因为我已经重载operator++了迭代器类
template<typename T>
typename list<T>::iterator& list<T>::iterator::operator++()
{
//stuff
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做的时候
list<int>::iterator IT;
IT++;
Run Code Online (Sandbox Code Playgroud)
我++使用前缀形式警告没有postifx .我怎样才能专门重载前缀/ postifx表单?
我刚从clang-tidy得到以下警告:
overloaded "operator++" returns a non-constant object
instead of a constant object type
Run Code Online (Sandbox Code Playgroud)
https://clang.llvm.org/extra/clang-tidy/checks/cert-dcl21-cpp.html
不幸的是,他们提供的链接不起作用,https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId = 88046682没有简单的方法来找到这个规则(看似DCL规则开始从50).
但无论我在标准中看到什么(对于ex 16.5.7增量和减量[over.inc]),我都没有找到postfix operator ++应该返回const的引用:
struct X {
X operator++(int); // postfix a++
};
Run Code Online (Sandbox Code Playgroud)
问题:只是铿锵过度保护,错误或为什么我要声明后缀的返回类型为const?
我想知道为什么以下输出7 7 6 7而不是5 6 6 7
my $a = 5;
printf("%d %d %d %d",$a,++$a , $a++ , $a);
Run Code Online (Sandbox Code Playgroud)
我很确定它与参数编译的顺序有关
谢谢,
请考虑以下代码
#include <iostream>
using namespace std;
class Digit
{
private:
int m_digit;
public:
Digit(int ndigit=0){
m_digit=ndigit;
}
Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int);
Digit operator--(int);
int get() const { return m_digit;}
};
Digit& Digit::operator++(){
++m_digit;
return *this;
}
Digit& Digit::operator--(){
--m_digit;
return *this;
}
Digit Digit::operator++(int){
Digit cresult(m_digit);
++(*this);
return cresult;
}
Digit Digit::operator--(int){
Digit cresult(m_digit);
--(*this);
return cresult;
}
int main(){
Digit cDigit(5);
++cDigit;
cDigit++;
cout<<cDigit.get()<<endl;
cout<<cDigit.get()<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里实现了两个版本的后缀和前缀运算符,我已经读过,通过引入另一个所谓的伪参数来做出差异,但我有疑问,如果我们看到这些的声明
Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int); …Run Code Online (Sandbox Code Playgroud) 有必要使用后缀定界符来表示源代码中使用的常量类型,例如L表示长.但是,对于short和bytes,没有分隔符,所以我需要显式地转换常量值,如下所示:
short x = (short)0x8000;
Run Code Online (Sandbox Code Playgroud)
我想知道Java是否在编译的字节码中采取额外的步骤来实际将其从整数类型转换为short,或者它是否知道这将适合一个单词并使用常量?否则,有没有一种方法可以将这些数字作为后缀来表示短或字节?
虽然这个问题可能在某处得到回答,但我找不到。
下面写的第一条语句有效而第二条语句无效?为什么?
int main() {
int x = 1, y = 2;
int *p = &++x; // First
std::cout << "*p = " << *p << std::endl;
// int *q = &x++; // Second
// std::cout << "*q = " << *p << std::endl;
}
Run Code Online (Sandbox Code Playgroud) c++ unary-operator pre-increment post-increment postfix-operator
我在java中尝试一元postfix和前缀运算符
这是代码
int a=10;
Run Code Online (Sandbox Code Playgroud)
这行代码不会产生编译时错误
System.out.println(a+++ a +++a);
Run Code Online (Sandbox Code Playgroud)
但这条线确实如此
System.out.println(a++ +++a);
Run Code Online (Sandbox Code Playgroud)
而这条线甚至没有
System.out.println(a+++ ++a);
Run Code Online (Sandbox Code Playgroud)
我无法理解编译器如何解释这些查询的模式.
我想知道如何运行这样的操作
$T = 25 C;
@specs = (273.15 K, 23 bar, 2.0 mol/s);
Run Code Online (Sandbox Code Playgroud)
并让他们编译.我不会挑剔他们的结果是什么,或者它是如何实现的.我的目标是让传统后缀单元注释的物理量表达式编译为这些单元的perl表达式.
我想我需要使用自定义解析技术,但我更喜欢使用任何现有功能或解析模块,而不仅仅是将regex过滤器应用于我的原始源.
Parse :: Keyword看起来很有希望,但我看不出它是否可以解析postfix操作,并声称它已被弃用.
编辑:我想尽可能避免源过滤器,因为我不想为Perl的语法极端情况编写正则表达式(例如"25(J/K)").
Perl在这里产生的错误告诉我:
perl -E "25 C"
Bareword found where operator expected at -e line 1, near "25 C"
(Missing operator before C?)
Run Code Online (Sandbox Code Playgroud)
看起来我需要挂钩Perl在数字文字之后检测运算符的地方.
可以Devel :: Declare添加后缀运算符吗?如果是这样,怎么样?
是否有可能解析一个表达式(没有歧义),它可以包含二进制前缀,二进制中缀和二进制后缀运算符(让我们假设所有符号都不同),它们之间具有优先权?例如:
a = 2 3 post+
b = pre+ 2 3*4
Run Code Online (Sandbox Code Playgroud)
然后a将等于5因为=优先级低于后缀post+运算符并且b将是14.我知道你可以用运算符优先解析或分流码解析中缀表示法,但这个问题对我来说似乎要复杂得多.
编辑:
允许括号,并且运算符的前/后变体具有与中缀相同的优先级.
我想推出一个手写算法.
EDIT2:
按优先顺序,我指的是消费多少.例如:
a = 2 3 post+
Run Code Online (Sandbox Code Playgroud)
可能导致这些AST-s:
'=' has higher precedence than 'post+':
post+
/ \
= 3
/ \
a 2
'post+' has higher precedence than '=':
=
/ \
a post+
/ \
2 3
Run Code Online (Sandbox Code Playgroud)
(第二个是我在这种情况下需要的).我不能真正使用现有的解析器生成器或固定语法来操作数,因为运算符是动态加载的.
parsing operator-precedence infix-operator prefix-operator postfix-operator