例如,當我在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. 定義(1 << 31)或使用0x80000000?結果不同
- 2. 什麼是`enum中的<Value>`結果<Value> {...}`?
- 3. 任務<IList<>>爲Func鍵<>的結果
- 4. JsonConvert.DeserializeObject <列表<Enrollment>>總是返回10個結果
- 5. 如何使用Eigen 3表示「<真或假> = <array><= <scalar>」?
- 6. 如何找出如果對象是<type>或<type>
- 7. 您可以在Ruby中定義<=>,然後自動定義==,>,<, > =和<=是否定義?
- 8. 0 <0的計算結果爲真?
- 9. 函數定義:如何讓一個字符串表明整數是否爲真或假?如果沒有</p> <pre><code>(one of 'even', 'odd', 'positive', or 'negative') </code></pre> <p>該函數返回<code>True</code>如果數值由字符串表示的屬性,<code>False</code>:
- 10. 緩存<cfstoredproc>結果
- 11. <模塊runAllManagedModulesForAllRequests =「真」 />含義
- 12. 將jquery.form ajax調用的結果寫入<canvas>或<img>標記
- 13. 未定義對<namespace> :: <variable>
- 14. IF語句意外的結果:「string」<= 72是真的?
- 15. 自定義的<Key>
- 16. 是否需要定義<button> TYPE?
- 17. 定義新的HashMap <>()時出現語法錯誤;或新的ArrayList <>();
- 18. 真或假的結果,爲什麼
- 19. EqualityComparer <Uri> .Default.Equals()返回錯誤的結果或什麼?
- 20. 返回結果或承諾的操作<Result>
- 21. 未定義的本地變量或方法`root_path'爲#<#<Class:0xc0d0c44>:0xc0be918>
- 22. 未定義的局部變量或方法<object> for#<Class:0x55ebe50>
- 23. 未定義的局部變量或方法`div'爲#<#Class <0x10923faf0>:0x109226b18>
- 24. 的是有人說的<code>mysql_query</code>返回類型是真真正返回值/類型的mysql_query
- 25. 含義值抓<code>R = 0</code>,<code>R = S</code>,<code>R = S*Da</code>含義和<code>kCGBlendMode</code>值如<code>kCGBlendModeClear</code>,<code>kCGBlendModeCopy</code>,<code>kCGBlendModeSourceIn</code>定義
- 26. 訂購的<xsl:when>結果頁面
- 27. XSD <any/>不同的結果marklogic
- 28. 限制System.Data.Linq.Table的結果<T>
- 29. 定義布爾邏輯運算符(V,^,異或, - >,<->)
- 30. <script>或<noscript>?
這是最有可能是重複的,但我不能夠找到它:-( – mbq
@TRD:不正確.C表達式'7> 1'產生類型爲'int'的結果,值爲' –