问题标签 [unary-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.

0 投票
3 回答
219 浏览

c++ - C ++中是否有“正常”一元逻辑运算符

我的意思是,我们都知道有否定逻辑运算符!,它可以这样使用:

是否有任何运营商允许这样做:

我知道这可能并不重要,但只是想知道!

0 投票
2 回答
783 浏览

c - printf 中的一元运算符

谁能解释我以下的输出。我试图推理一切,并可以解释后面的部分,其中“x”被分配了表达式的值,但无法理解 printf 语句中的答案有何不同!!!

不同的编译器可能表现不同。如果有人可以为任何编译器解释这种行为,那就太好了。

我在 openSUSE 12.1 (Asparagus) (i586) 上使用 gcc (SUSE Linux) 4.6.2

代码 :

输出 :

谢谢

0 投票
3 回答
228 浏览

c++ - int& 上的一元 + 运算符

我有以下声明,它编译:

为什么我没有编译器错误?

0 投票
2 回答
3350 浏览

c++ - 0x80000000 的一元减号(有符号和无符号)

n3337.pdf 草案 5.3.1.8 指出:

一元运算-符的操作数应具有算术或无范围枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整数提升。无符号量的负数是通过从 2ⁿ 中减去其值来计算的,其中 n 是提升的操作数中的位数。结果的类型是提升的操作数的类型。

对于某些情况,这就足够了。假设 unsigned int 是 32 位宽,那么(-(0x80000000u)) == 0x80000000u,不是吗?

尽管如此,我还是找不到关于 unsigned 0x80000000 上的一元减号的任何信息。此外,C99 标准草案 n1336.pdf, 6.5.3.3 似乎对此一无所知:

一元 - 运算符的结果是其(提升的)操作数的负数。整数提升在操作数上执行,结果具有提升的类型。

UPDATE2:让我们假设 unsigned int 是 32 位宽。所以,问题是:C 中的一元减号(有符号和无符号)和 C++ 中的一元减号(仅有符号)呢?

UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣。

(相关:为什么是abs(0x80000000)== 0x80000000?

0 投票
2 回答
683 浏览

c++ - 仅限 c++:0x80000000 的一元减号

这个问题应该是针对语言律师的。

假设 signed 和 unsigned int 都是 32 位宽。如 n3337.pdf 草案 5.3.1.8 所述,

(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u

但我找不到问题的答案:签名的0x80000000 的一元减号是什么?是 UB、实现定义还是...?

问题主要是关于运行时计算。

不过,欢迎您对其他 2 个案例发表评论:

  • 编译时常量折叠,比如说,-(INT_MIN)

  • 编译时计算constexpr(如果与编译时常量折叠有区别)。


(请在为重复投票之前查看https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practice 。)

0 投票
2 回答
797 浏览

php - javascript和PHP上的三元运算符,不同的输出

我想用一元if在php中做Fizzbuzz,但输出不是我所期望的,我也不明白为什么,所以我将代码复制粘贴到javascript,现在结果符合预期。为什么?

输出

0 投票
3 回答
1586 浏览

c# - 条件语句检查 Null

我试图弄清楚如何有一个简短的单行条件语句。

如果此日期不为空,则将过滤器添加到当前过滤器列表中:

fromDt ?? filters.Add(FilterType.DateFrom, fromDt);

有没有办法做到这一点?我知道我能做到。。

(fromDt != null) ? "something" : "something_else",但我不需要'else',并且真的很想使用??运算符进行空检查。

0 投票
2 回答
1199 浏览

java - Hibernate QL中的否定一元运算符

我正在尝试使用以下 hql 切换布尔字段:

不幸的是“QuerySyntaxException:意外令牌:不在附近......”被抛出。

我的问题是:是否有一些支持这种表达的休眠一元运算符?或者有什么众所周知的技巧?

sql 支持这样的查询(postgresql):

0 投票
1 回答
1074 浏览

antlr - 使用 antlr 简化 smalltalk 语法 - 一元减号和消息链

我正在使用 antlr 编写简单的类似 smalltalk 的语法。它是 smalltalk 的简化版本,但基本思想是相同的(例如消息传递)。

到目前为止,这是我的语法:

1. 一元减号

我对数字的一元减号有疑问(规则的注释部分number)。问题是减号是有效的二进制消息。更糟糕的是,两个减号也是有效的二进制消息。我需要的是一元减号,以防没有对象可以向其发送二进制消息(例如,-3+4 应该是一元减号,因为 -3 前面没有任何内容)。此外,(-3) 也应该是二进制减号。如果 1 -- -2 是带有参数 -2 的二进制消息“--”,那就太好了,但我可以没有它。我怎样才能做到这一点?

如果我取消注释一元减号,则在解析 1-2 之类的内容时会出现错误 MismatchedSetException(0!=null)。

2. 消息链

在 smalltalk 中实现消息链接的最佳方法是什么?我的意思是这样的:

在这种情况下,每条消息都将发送到同一个对象obj。应保持消息优先级(一元 > 二进制 > 关键字)。

3. 回溯

大多数语法可以用 解析k=2,但是当输入是这样的:

解析器尝试将 Obj 匹配为single_keyword_message_selector并引发UnwantedTokenExcaptiontoken message。如果删除k=2并设置backtrack=true(像我一样)一切正常。如何删除回溯并获得所需的行为?

此外,大多数语法都可以使用 解析k=1,所以我尝试k=2只为需要它的规则设置,但这被忽略了。我做了这样的事情:

但在我在全局选项中设置 k 之前它不起作用。我在这里想念什么?


更新

从头开始编写语法并不是理想的解决方案,因为我有很多代码依赖它。此外,smalltalk 缺少的一些功能是设计上缺少的。这并不是要成为另一个 smalltalk 实现,smalltalk 只是一个灵感。

在这样的情况下,我会更乐意让一元减号工作:-1+22+(-1). 像这样2 -- -1的情况并不那么重要。

此外,消息链接应该尽可能简单地完成。这意味着我不喜欢改变我正在生成的 AST 的想法。

关于回溯 - 我可以忍受它,只是出于个人好奇在这里问。

这是生成 AST 的少量修改语法 - 也许它有助于更​​好地理解我不想更改的内容。(temp_variables 可能会被删除,我还没有做出那个决定)。

0 投票
1 回答
5726 浏览

c++ - 解析树中的一元和二元减号

我正在创建一个包含类似于以下表达式的解析树

3 - 4 * 8

或者

8 * -5

或者

-(10 * 1)

我需要一种方法来区分一元和二元减号。我的语法现在的方式是首先达到二进制减号,但我正在考虑更改它并添加一个包含最后一个变量的标志变量。

例如:如果是5 - 6

该标志持有 5,如果它看到减号并且标志是一个数字,则跳过一元并转到二进制。

但是我不确定如何在 C++ 中实现这一点

任何帮助将不胜感激。

谢谢