【问题标题】:Use of logical || with constant operand使用逻辑 ||具有常数操作数
【发布时间】:2014-10-31 14:40:51
【问题描述】:

我有几个这样的定义:

#define flag   YES
#define prod   YES
#define test   NO

这些用于测试。

我有一段代码

BOOL testMode = flag || prod || test;

Xcode 抱怨此消息:使用逻辑 ||使用常量操作数...使用按位修复它

但我正在做的操作是合乎逻辑的,不是按位的。

如果 3 个状态之一为 YES,我希望 testMode 为 YES。

有什么线索吗?

【问题讨论】:

  • 它认为你做错了什么,想要“帮助”你。
  • 这是一个令人惊讶的警告。我无法通过将您的代码粘贴到源文件中来重现。
  • @danh 是的,我使用了相同的代码并且没有收到任何警告..
  • 我能够重现它...似乎您可以将代码替换为 BOOL testMode = flag | prod | test; 并在没有警告的情况下获得相同的结果。这可能是更困扰您的问题...不必要的警告或使用按位 | 运算符进行本质上的逻辑运算。
  • 它似乎旨在捕捉人们错误地使用带有位字段的逻辑运算符。当您尝试设置位 2 时,您不希望意外写入 bitField || 0x4

标签: ios xcode cocoa cocoa-touch


【解决方案1】:

以下代码在没有警告的情况下得到相同的结果。

BOOL testMode = flag | prod | test;

这可能是更困扰您的问题...不必要的警告或使用按位| 运算符进行本质上是逻辑操作的操作。该警告似乎旨在捕捉人们错误地使用带有位字段的逻辑运算符。当您尝试设置位 2 时,您不希望意外写入 bitField || 0x4

【讨论】:

  • 是的,编译器真的无法区分 YES、NO 和 0x7341 —— 它们只是数值。因此它猜测您正在尝试进行某种位设置/屏蔽操作并且错误地使用了“逻辑”运算符。
【解决方案2】:

我更喜欢这个:

BOOL testMode = (BOOL)flag || (BOOL)prod || (BOOL)test;

【讨论】:

  • 最佳解决方案,因为它适用于任何情况。但是,不是bool 也不是BOOL
【解决方案3】:

警告消失了:

#define flag   true
#define prod   true
#define test   false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多