我只是想知道为什么我们通常||在两个布尔值之间使用逻辑OR 而不是按位OR |,尽管它们都运行良好.
我的意思是,看看以下内容:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
Run Code Online (Sandbox Code Playgroud)
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
Run Code Online (Sandbox Code Playgroud)
我们可以用|而不是||吗?同样的事情&和&&.
我正在创建一个创建一个搜索数据库的应用程序,并允许用户动态添加任何标准(大约50种可能),非常类似于以下SO问题:使用实体框架创建动态查询.我目前正在进行搜索,检查每个条件,如果它不是空白,则将其添加到查询中.
C#
var query = Db.Names.AsQueryable();
if (!string.IsNullOrWhiteSpace(first))
query = query.Where(q => q.first.Contains(first));
if (!string.IsNullOrWhiteSpace(last))
query = query.Where(q => q.last.Contains(last));
//.. around 50 additional criteria
return query.ToList();
Run Code Online (Sandbox Code Playgroud)
此代码在sql server中生成类似于以下内容的东西(为了便于理解,我进行了简化)
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
AND [LastName] LIKE '%last%'
Run Code Online (Sandbox Code Playgroud)
我现在尝试添加一种方法,通过实体框架使用C#生成以下SQL,但使用OR而不是AND,同时仍然保持动态添加条件的能力.
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
Run Code Online (Sandbox Code Playgroud)
通常,条件不会大于查询的两个或三个项目,但将它们组合成一个巨大的查询不是一种选择.我尝试过concat,union和intersect,他们只是复制查询并将它们与UNION连接起来.
是否有一种简单而干净的方法可以使用实体框架向动态生成的查询添加"OR"条件?
使用我的解决方案进行编辑 - 2015年9月29日
自发布以来,我注意到这已经得到了一点关注,所以我决定发布我的解决方案
// Make …Run Code Online (Sandbox Code Playgroud) 也就是说,如果我有一个评估多个条件的语句,比如说'或'这样的语句.
if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下isVeryLikely(),在运行时返回true,将isSomewhatLikely()和isHardlyLikely()执行?如果不是方法而是静态布尔值呢?
在Java中,我被分配以比较两个3个正双变量,而忽略它们的顺序。我做了以下事情:
if ((a1 == a2 && b1 == b2 && c1 == c2) ||
(a1 == a2 && b1 == c2 && c1 == b2) ||
(a1 == b2 && b1 == a2 && c1 == c2) ||
(a1 == b2 && b1 == c2 && c1 == a2) ||
(a1 == c2 && b1 == a2 && c1 == b2) ||
(a1 == c2 && b1 == b2 && c1 == a2))
// if true
Run Code Online (Sandbox Code Playgroud)
我从老师那里听说,有一种数学方法可以比较这对3个数字。
到目前为止,我试图将它们的加,减,乘幂之和与2进行比较,但是我总是发现这样的情况,即该对是不同的,并且陈述是正确的。
有任何想法吗?
编辑: …
var a = 1;
function myFunction() {
++a;
return true;
}
// Alert pops up.
if (myFunction() && a === 2) {
alert("Hello, world!");
}
// Alert does not pop up.
if (a === 3 && myFunction()) {
alert("Hello, universe!");
}
Run Code Online (Sandbox Code Playgroud)
https://jsfiddle.net/3oda22e4/6/
myFunction递增一个变量并返回一些东西.如果我在if包含它递增的变量的语句中使用这样的函数,则条件将依赖于顺序.
这样做有好有坏,为什么?
这些是在Dev-cpp C++ 5.4.2上编写的两个简单的C++示例:
float a, b, c;
if (a | b & a | c)
printf("x = %.2f\tF = %.0f\n", x, F);
else
printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)
而这段代码:
float a, b, c;
if (a || b && a || c)
printf("x = %.2f\tF = %.0f\n", x, F);
else
printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)
有谁能告诉我之间的差异||> |和&> &&.第二个代码有效,但首先没有.编译器给出了一条错误消息:
[错误]类型'float'和'float'到二进制'运算符&'的操作数无效.
小疑问.为什么输出以下代码1?为什么不3呢?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
Run Code Online (Sandbox Code Playgroud) 你能解释一下为什么下面的程序会给出这样的输出吗?
#include<stdio.h>
int main()
{
int i=-3,j=1,k=0;
int m;
m=++i || ++j && ++k;
printf("i= %d\nj=%d\nk=%d\nm=%d", i,j,k,m);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
i= -2
j=1
k=0
m=1
有没有办法做这种情况:
if ( x > 3 || y > 3 || z > 3 ) {
...
}
Run Code Online (Sandbox Code Playgroud)
我在考虑一些按位操作但却找不到任何东西.
我在Google上搜索过,但很难找到与这类基本问题相关的内容.谢谢!
编辑 我在一般编程中思考.根据特定的语言会有所不同吗?比如C/C++,Java ......
java ×4
c# ×2
c ×1
c++ ×1
compare ×1
conditional ×1
function ×1
if-statement ×1
javascript ×1
linq ×1
math ×1
optimization ×1
sql-server ×1
variables ×1