我们一直在工作中进入不必要的编码论证.今天我询问条件AND(&&)或OR(||)是否具有更高的优先级.我的一个同事坚持认为他们有同样的优先权,我有疑虑,所以我查了一下.
根据MSDN AND(&&)具有比OR(||)更高的优先级.但是,你能向持怀疑态度的同事证明这一点吗?
http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx
bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as
bool result = false || (true && false); // --> false
Run Code Online (Sandbox Code Playgroud)
所以我的问题是你如何用代码证明AND(&&)的优先级高于OR(||)?如果你的答案无关紧要,那么为什么用这种语言建立?
c# conditional conditional-operator operator-precedence associativity
在C++中,?:运算符比if()... else语句更快?它们在编译代码中有什么区别吗?
我对这个小C#quirk感到有点难过:
给定变量:
Boolean aBoolValue;
Byte aByteValue;
Run Code Online (Sandbox Code Playgroud)
以下编译:
if (aBoolValue)
aByteValue = 1;
else
aByteValue = 0;
Run Code Online (Sandbox Code Playgroud)
但这不会:
aByteValue = aBoolValue ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
错误说:"不能隐式地将类型'int'转换为'byte'."
当然,这个怪物会编译:
aByteValue = aBoolValue ? (byte)1 : (byte)0;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
编辑:
使用VS2008,C#3.5
在我正在研究的其中一个项目中,我看到了这段代码
struct Base {
virtual ~Base() { }
};
struct ClassX {
bool isHoldingDerivedObj() const {
return typeid(1 ? *m_basePtr : *m_basePtr) == typeid(Derived);
}
Base *m_basePtr;
};
Run Code Online (Sandbox Code Playgroud)
我从来没有见过这样的typeid用法.为什么它会做那种奇怪的舞蹈?:,而不仅仅是做typeid(*m_basePtr)?有什么理由吗?Base是一个多态类(带有虚拟析构函数).
编辑:在这个代码的另一个地方,我看到这个,它似乎是等价的"多余的"
template<typename T> T &nonnull(T &t) { return t; }
struct ClassY {
bool isHoldingDerivedObj() const {
return typeid(nonnull(*m_basePtr)) == typeid(Derived);
}
Base *m_basePtr;
};
Run Code Online (Sandbox Code Playgroud) EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: Convert.ToInt32(employeeNumberTextBox.Text),
Run Code Online (Sandbox Code Playgroud)
我经常发现自己想要做这样的事情(EmployeeNumber是Nullable<int>因为它是在LINQ到SQL的DBML对象,其中列允许NULL值的属性).不幸的是,编译器认为"'null'和'int'之间没有隐式转换",即使这两种类型在对自己的可空int的赋值操作中都是有效的.
由于内联转换需要在.Text字符串上发生(如果它不为空),因此Null合并运算符不是我能看到的选项.
据我所知,唯一的方法是使用if语句和/或分两步进行分配.在这种特殊情况下,我发现非常令人沮丧,因为我想使用对象初始化器语法,这个赋值将在初始化块中...
谁知道更优雅的解决方案?
如果以前曾经问过这个问题,我会道歉,但我无法在任何地方看到它.
基本上我遇到过一个场景,我需要在lambda函数中使用if语句.困难之处在于理想情况下它需要在一行代码中(如果可能的话甚至可能?)
通常,我会这样写:
T = 250
if (T > 200):
rate = 200*exp(-T)
else:
rate = 400*exp(-T)
return (rate)
Run Code Online (Sandbox Code Playgroud)
但是我需要它看起来像这样:
rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T))
Run Code Online (Sandbox Code Playgroud)
我意识到更容易做的事情是在lambda函数之外做出决策,然后为每个case都有一个单独的lambda函数,但它不适合这里.lambda函数存储在一个数组中,并在需要时访问,每个数组元素对应一个特定的"速率",因此对于相同的"速率"有两个单独的行会弄乱.任何帮助将不胜感激,或如果它不可能,其他人的一些确认将是不错的:)
python lambda if-statement ternary-operator conditional-operator
只是为了好奇/方便:C#提供了两个我知道的很酷的条件表达式功能:
string trimmed = (input == null) ? null : input.Trim();
Run Code Online (Sandbox Code Playgroud)
和
string trimmed = (input ?? "").Trim();
Run Code Online (Sandbox Code Playgroud)
对于我经常遇到的情况,我想念另一个这样的表达:
如果输入引用为null,则输出应为null.否则,输出应该是访问输入对象的方法或属性的结果.
我在第一个例子中完成了这一点,但是(input == null) ? null : input.Trim()非常冗长且难以理解.
这种情况是否有另一个条件表达式,或者我可以??优雅地使用运算符吗?
条件运算符需要什么?在功能上它是多余的,因为它实现了if-else结构.如果条件运算符比等效的if-else赋值更有效,为什么编译器不能更有效地解释if-else?
以下表达式是可以的
short d = ("obj" == "obj" ) ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)
但是当您像下面一样使用它时,会发生语法错误
short d = (DateTime.Now == DateTime.Now) ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)
无法将类型'int'隐式转换为'short'.存在显式转换(您是否错过了演员?)
任何人都可以解释为什么会这样吗?
在三元运算符中比较字符串到字符串和datetime到datetime之间有区别吗,为什么?
如果你能帮助我,我将不胜感激.
我知道如果/ else语句可以用一行设置变量var variable = (condition) ? (true block) : (else block),但是我想知道是否有办法在那里放置else if语句.任何建议将不胜感激,谢谢大家!
c# ×5
c++ ×2
.net ×1
c ×1
casting ×1
conditional ×1
if-statement ×1
int ×1
javascript ×1
lambda ×1
nullable ×1
operators ×1
performance ×1
python ×1
short ×1
typeid ×1
types ×1