问题标签 [postfix-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在 C++ 中使用递减/递增后缀运算符时如何防范风险?
最近我发现像这样使用 st 的风险:
它实际上得到 sum = 9 + 8 + 7 + .. + 1。所以它总共缺少 10。但我更喜欢这种编码方式,它既快速又专业。有什么建议可以防止风险并且仍然有简洁的代码吗?
c++ - 为什么后缀运算符++的优先级高于前缀运算符++?
以这种方式定义,我们既不能做++x++
也不做++x--
。但另一方面,(++x)++
and(++x)--
都是有用的表达式:(++x)++
递增x
2 并返回“中间”的值,while(++x)--
本质上等同于x+1
但完全避免了调用operator+
,这有时非常有用。
那么为什么优先级没有定义为++x++
自动扩展为(++x)++
而不是++(x++)
?后者是否有一些我不理解的隐藏含义,或者只是为了将优先级保持为一个简单的列表,所有前缀运算符构成一个级别?
编辑好吧,我没有明确说出来,但是:当然我的意思x
是用户定义的类型。对于内置类型,(x+=2)-1
当然比好(++x)++
,而且x+1
比. 我想到的情况是一种相当复杂的半关联容器类型的迭代器,其中操作员和(设计用于随机访问)必须重建缓存才能有效地处理一般请求,因此是一个命令幅度比 慢。但是当然我可以修改它们以始终首先检查参数是否是一个非常小的整数,在这种情况下只需调用(++x)--
+=
+
++
operator++
重复而不是执行随机访问过程。这在这里应该可以正常工作,尽管我可以想象我可能会在某个时候遇到这样一种情况,即我想operator+=
始终采用随机访问方式,而不管我呈现的数字有多小。
所以......对我来说,我的结论是:
拥有一个简单且易于记忆的优先级列表(其中所有后缀运算符都位于任何前缀运算符之前)的优势足以容忍始终必须使用括号来组合前置和后置运算符
++
/的小缺点--
,因为这种组合是很少使用。
更简单的“C 这样做”,虽然这似乎是真正的原因,但对我来说远没有那么令人满意,因为因为在 C++x++
中根本不允许,所以可以重新定义这个组合而不破坏任何现有代码。
无论如何,我会继续使用(++x)--
,因为括号真的没有那么大的伤害。
python - 解析问题
现在我刚刚开始使用pyparsing
来解析简单的后缀表达式。目前,我做到了这一点:
但是当我运行它时,它会打印:
我究竟做错了什么?
java - Java 中 ++ 和 -- 运算符的优先级
我从 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。
c++ - 编译器如何解释 preincrement/decrement 和 postincrement/decrement
当有人询问后自增/自减和前自增/自减之间的区别时,答案通常是前缀版本将变量加一并返回变量的新值,而后缀版本将变量加一并且返回旧值。
在胡闹的时候,我发现所有这些行都是合法的:
但以下行都不合法:
如果我假设前缀版本通过引用返回,这一切都是有道理的(即使是最后一个示例,因为后缀的优先级高于前缀)。
前缀版本返回引用而后缀版本返回值的假设/实现是否正确?对于 pre/post inc/decrement 运算符,是否还有其他我不知道的细微行为差异?
c - parseInt 的后缀导致错误
行:n2[i-dec-1] = parseInt(n2[i-dec-1])++;
错误:“后缀操作中的左侧表达式无效。”
解决方案:n2[i-dec-1] = parseInt(n2[i-dec-1])+1;
我很好奇为什么后缀与数组中的 parseInt 值有问题(解析为 0)。
答案:原来整数的后缀是不正确的。该过程会导致错误。
c - 前缀和后缀运算符有什么区别?
下面的代码打印出一个值 9。为什么?这里return(i++)
将返回一个 11 的值,由于--i
该值本身应该是 10,任何人都可以解释它是如何工作的吗?
c# - 为什么后缀 ++/-- 在 C# 中被归类为主要运算符?
目前,我正在向一班 C++ 程序员教授 C# 语言的基础知识。在我们讨论主题运算符时,我使用了 C# 标准类别的主要运算符、一元运算符等。
其中一位与会者感到困惑,因为在 C# 标准中,“后缀 ++/--”已被置于主要运算符的类别中,而不是“前缀 ++/--”。她造成这种混淆的理由是,她宁愿根据运算符“前缀 ++/--”来实现 C++ 运算符“后缀 ++/--”。换句话说,她宁愿将运算符“前缀++/--”算作主要运算符。- 我理解她的观点,但我不能给她一个背后的理由。好的,运算符“postfix ++/--”的优先级高于“prefix ++/--”,但这是唯一的理由吗?
规范在“14.2.1 运算符优先级和关联性”一节中提到了它。
所以我非常中性的问题:为什么后缀 ++/-- 在 C# 中被归类为主要运算符?这里面有更深的真相吗?
c++ - 重载后缀和前缀运算符
请考虑以下代码
这里实现了两个版本的后缀和前缀运算符,我已经读到通过引入另一个所谓的虚拟参数来产生差异,但我有疑问,如果我们看到这些声明
它们的区别在于 & 标记,那么为什么需要虚拟参数?而且在这两种情况下,例如 ++ 运算符都写在参数之前,这不意味着它们是相同的吗?
java - Java 后缀分隔符
有必要使用后缀分隔符来表示源代码中使用的常量类型,例如 L 长。但是,对于短裤和字节,没有分隔符,所以我需要像这样显式地转换常量值:
我想知道Java是否在编译的字节码中采取了额外的步骤来实际将它从整数类型转换为短类型,或者它是否知道这将适合一个单词并按原样使用常量?否则,有没有办法可以对这些数字进行后缀来表示短或字节?