例如,当我在C中编写7>1
(如果C99不是一直以来的特性,那么说C99),我可以期待结果恰好是1还是只是一个非零值?这对所有bool操作员都适用吗?是>,<,!,&&,||的“真”结果或==定义?
回答
在C99§6.5.8关系运算符,项目6(<
,>
,<=
和>=
):
每个运营商<(小于),>(大于)的,< =(小于或等于),和> = (大于或等于)应得到如果指定的关系为真和如果是假的) 结果具有类型INT。
至于相等运算,它有点进一步在§6.5.9(==
和!=
):
的==(等于),=(不等于)运算符是类似到关系 运算符,但其优先级较低)每个运算符产生如果 指定的关系为真,并且如果它为假。结果有int。对于任何一对 操作数,其中一个关系是正确的。
逻辑AND和OR的逻辑还没有有点进一步§6.5.13(&&
)
的& &操作者应得到如果两个操作数的比较不等于0;否则,它 产量。结果有int。
...和§6.5.14(||
)
的||如果其任一操作数比较不等于0,则操作员应产生;否则,它 产量。结果有int。
而一元算术运算符!
的语义超过在§6.5.3.3/ 4:
逻辑否定运算符的结果!是如果其操作数的值与 不等于0,如果它的操作数的值等于0,则结果的类型为int。表达式!E相当于(0 == E)。
结果类型是int
全线,与0
和1
作为可能的值。 (除非我错过了一些。)
C遵循Postel's Law的布尔运算符:在你做的事情上要保守,在你接受别人的事情时要保持自由。它将在布尔表达式中将任何非零值视为true,但它本身始终会生成0或1。 2 != 3
始终是1
。
提及Postel定律+1 – glglgl
从ISO C99标准,部分6.5.8:
6每个运营商<(小于)的,>(大于),< =(小于 或等于),和> =(大于或等于)应该在 指定的关系为真时产生1,如果为假,则为0。结果有 int类型。
从节6.5.9:
3 ==(等于),=(不等于)运算符类似于 除了它们的低优先级的关系运算符。如果指定的关系为真,则运算符的每个 产生1,如果 为假,则为0。结果的类型为int。对于任何一对操作数, 恰恰是其中一个关系是真实的。
运算符与逻辑连接(&&
)和析取(||
)运算符发生同样的事情。附注:这就是为什么按位运算符(&
和|
)通常可用作逻辑运算符的非短路版本。
所有的C 运营,其产生逻辑真/假值总是产生int
类型的结果,其值为0
为假,1
为真。
对于所有产生逻辑真/假值的C 表达式,情况并非如此。例如,如果条件为假,则在<ctype.h>
(isdigit()
,isupper()
等)中声明的is*()
字符分类函数将返回0
,但如果条件为真,则可能会返回任何非零值。
只要你直接使用结果作为条件:
if (isdigit(c)) ...
if (!isdigit(c)) ...
if (isdigit(c) || islower(c)) ...
和不试图把它比作什么:
if (isdigit(c) == 1) ... /* WRONG */
if (isdigit(c) == true) ... /* ALSO WRONG */
这应该不会造成任何问题。
(您可以安全的结果比较0
或false
,但没有很好的理由这样做,这就是!
操作是什么。)
- 1. 如何使用Eigen 3表示“<真或假> = <array><= <scalar>”?
- 2. 您可以在Ruby中定义<=>,然后自动定义==,>,<, > =和<=是否定义?
- 3. 如何找出如果对象是<type>或<type>
- 4. 函数定义:如何让一个字符串表明整数是否为真或假?如果没有</p> <pre><code>(one of 'even', 'odd', 'positive', or 'negative') </code></pre> <p>该函数返回<code>True</code>如果数值由字符串表示的属性,<code>False</code>:
- 5. 缓存<cfstoredproc>结果
- 6. IF语句意外的结果:“string”<= 72是真的?
- 7. 自定义的<Key>
- 8. 是否需要定义<button> TYPE?
- 9. 真或假的结果,为什么
- 10. EqualityComparer <Uri> .Default.Equals()返回错误的结果或什么?
- 11. 未定义的本地变量或方法`root_path'为#<#<Class:0xc0d0c44>:0xc0be918>
- 12. 未定义的局部变量或方法<object> for#<Class:0x55ebe50>
- 13. 限制System.Data.Linq.Table的结果<T>
- 14. XSD <any/>不同的结果marklogic
- 15. 定义布尔逻辑运算符(V,^,异或, - >,<->)
- 16. 没有结果的行动<class>定义,并导致输入
- 17. 特性绑定T:从<结果<T, Error>>不满意
- 18. <script>或<noscript>?
- 19. FilePathResult或自定义操作结果?
- 20. 结果教练ID = 1的查询是错误的或真实
- 21. referenceError:<function>未定义
- 22. - >结果= $(ls -l)(或) - >结果=`ls -l`
- 23. PHP查询结果添加额外<li></li>
- 24. 我可以访问自定义HTML代码<component>或<slot>内容
- 25. 结合两个Expression <Func <T, bool>>(“where clause”)和/或
- 26. <tspan>文本</tspan>如果未定义id或class,如何删除文本?
- 27. 如何申请如果条件为以下结果?的<code>$res</code>显示以下结果
- 28. NoMethodError:未定义的方法`结果”为#<NoMethodError:未定义的方法`字段的零:NilClass>
- 29. 转:为什么结构体与其他类型“实例化”不同?</p> <p>如果它是一个普通类型:<code>MyFloat(2)</code></p> <p>如果它是一个结构:<code>MyFloat{2}</code></p> <p>是否有此特殊原因
- 30. 用预定义结果投掷动画的真实骰子
这是最有可能是重复的,但我不能够找到它:-( – mbq
@TRD:不正确.C表达式'7> 1'产生类型为'int'的结果,值为' –