我正在开发一个应用 MISRA 2004 的项目。
对于大多数违规行为,我都找到了原因,但有一个我不明白:
它在 if 语句中带有&&
和||
操作。
例子:
uint8 getValue()
{
// Some algorithm, simplified with return 1
uint8 someValue = 1u;
return someValue;
}
int main(int argc, char *argv[]) {
uint8 currentState = 0u;
uint8 var_a = getValue();
uint8 var_b = getValue();
uint8 var_c = getValue();
uint8 var_d = getValue();
const uint8 const_a = 1u;
const uint8 const_b = 2u;
const uint8 const_c1 = 3u;
const uint8 const_c2 = 30u;
const uint8 const_d = …
Run Code Online (Sandbox Code Playgroud) 对于这里的C#专家来说应该是一个简单的问题.
我基本上想要检查一个值或另一个值是否为TRUE,代码的狂野刺戳如下:
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
Run Code Online (Sandbox Code Playgroud)
它是否正确?
谢谢
我有一个具有 state 属性的对象,例如state = 'state4'或state = 'state2'。
现在我还有一个包含 state 属性可以获得的所有可用状态的数组,state1到state8(注意:这些状态没有命名为 stateN。它们有八个不同的名称,例如 payment 或 Canceled。我只是用 stateN 来描述问题) 。
除此之外,我还有一个逻辑表达式,例如$expression = !state1||state4&&(!state2||state5)。这是上述描述的代码:
$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';
Run Code Online (Sandbox Code Playgroud)
现在我想检查逻辑表达式是真还是假。在上面的例子中,确实如此。在以下情况下它将是错误的:
$state = 'state1';
$expression = state4&&!state2||(!state1||state7);
Run Code Online (Sandbox Code Playgroud)
如何以优雅的方式解决这个问题?
在JavaScript中,似乎:
(4294958077 | 0) == -9219
Run Code Online (Sandbox Code Playgroud)
为什么不是4294958077?
它表明存在某种溢出(虽然我理解它的JavaScript数字类型的范围是+/- 9007199254740992,所以这本身就是奇怪的.)
即使它是溢出,肯定
(4294958077 | 0) == 4294958077
Run Code Online (Sandbox Code Playgroud)
应该评价为真 - 但事实并非如此.
请帮忙
我注意到Python 2.7逻辑表达式的奇怪行为:
>>> 0 and False 0 >>> False and 0 False >>> 1 and False False >>> False and 1 False
并用True代替False
>>> 0 and True 0 >>> True and 0 0 >>> 1 and True True >>> True and 1 1
Python将逻辑语句转换为整数时是否有任何规则?为什么有时会显示0为假,1为真?
更重要的是,为什么会归还这个?
>>>"test" or "test" 'test'
对抗锯齿方法做了一些研究,我偶然发现了这段代码(从Nvidia的FXAA着色器中抓取):
if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
Run Code Online (Sandbox Code Playgroud)
是不是有一个很好的理由不是作为以下内容写的?
if (!pairN) {
lumaN = lumaS;
gradientN = gradientS;
lengthSign *= -1.0;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是某种优化?看起来真的违反直觉......
(注意:以下情况仅仅是示例性的.这个问题适用于任何可以评估为bool的事情)
如果用户未提供自定义列表,则应使用默认列表:
default_list = ...
custom_list = ...
if custom_list:
list = custom_list
else:
list = default_list
Run Code Online (Sandbox Code Playgroud)
你可以缩短到:
default_list = ...
custom_list = ...
list = custom_list if custom_list else default_list
Run Code Online (Sandbox Code Playgroud)
现在,根据https://docs.python.org/2.7/reference/expressions.html#or ...
表达式
x or y
首先评估x
; 如果x为真,则返回其值; 否则,将评估y并返回结果值.
...,or
不返回布尔值,而是返回布尔转换不为false的第一个值.因此,以下是有效的代码:
list = custom_list or default_list
Run Code Online (Sandbox Code Playgroud)
这与C#Null Coalescing运算符类似,不同之处在于它应该作为False Coalescing Operator在Python中重新生成,它返回第一个非false参数.
最后一个例子似乎更容易阅读,但它被认为是pythonic?
无论PEP8(程序),也不pylint的不抱怨.
python boolean-logic coding-style conditional-operator language-lawyer
我有一个包含布尔逻辑的字符串,例如:
var test = "(true)&&(false)&&!(true||true)"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在 JavaScript 中评估此字符串以获取 false 的布尔值的好方法是什么
我正在尝试为 R 中的逻辑变量创建一个“隐含”运算符,以使命题演算更容易。但是,它似乎与否定运算符一起玩得并不好。正如此处的最后 4 行所示,我必须将取反变量括在括号中才能使蕴涵运算符正常工作。
我怀疑运算符优先级是问题,但我不确定。从我读到的内容来看,没有办法改变中缀运算符的优先级。有没有一种方法可以重新定义,implies()
以便(!q) %->% (!p)
不需要括号?
> implies <- function(p, q) !p | q
> "%->%" <- implies
>
> p <- c(TRUE, TRUE, FALSE, FALSE)
> q <- c(TRUE, FALSE, TRUE, FALSE)
> p %->% q
[1] TRUE FALSE TRUE TRUE
> !q %->% !p
[1] TRUE FALSE FALSE FALSE
> (!q) %->% !p
[1] TRUE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud) 下面的代码std::cout << (0 < 5 < 2);
输出1
(true) 到控制台,即使从数学上讲,它5 < 2
是假的。这背后的逻辑是什么?
假设:这是因为0 < 5
计算为 1,因此0 < 5 < 2
计算为1 < 2
。我对么?
boolean-logic ×10
javascript ×2
python ×2
boolean ×1
c ×1
c# ×1
c++ ×1
coding-style ×1
eval ×1
evaluation ×1
glsl ×1
gpu ×1
hlsl ×1
if-statement ×1
math ×1
misra ×1
opengl ×1
php ×1
python-2.7 ×1
r ×1
types ×1