在 if 语句中使用移位变量 - 错误与否
using bit shifting variables inside if statement - error or not
假设我们有一些变量 x 和 y,以及以下涉及位移的 if 语句:
if (x<<y)
我已经阅读了一些帖子,这些帖子也处理了对(某种类型的)变量和 if 语句内部使用位移位的问题,但不幸的是,我无法得出明确的结论,这是否是一个错误与否。
我假设如果它是错误,那么它是语义错误或 运行-time 错误。
但这一定是错误的吗?
这不是语法错误。 if
需要带括号的表达式。 (int_x<<int_y)
满足。 shift 表达式可能会导致运行时错误,但前提是 int_x
和 int_y
的特定值会调用未定义的行为(请参阅 6.5.7 了解何时可能发生)。
如果x
是无符号整数类型,至少和unsigned int
一样大,并且y
小于x
的位数' s 类型,那么上面的部分语句将测试是否设置了 x
中 不是 顶部 y
中的位。如果 x
是有符号类型或小型无符号类型,C89 标准将要求实现行为类似,但需要注意的是,设置小型有符号类型的最高位被视为设置所有超出的位。但是,C99 和更高版本的标准不要求实现有效地处理 x
是 non-zero 但表达式 x<<y
将产生零的任何情况,除非 x
是至少与 unsigned int
.
一样大的无符号整数类型
假设我们有一些变量 x 和 y,以及以下涉及位移的 if 语句:
if (x<<y)
我已经阅读了一些帖子,这些帖子也处理了对(某种类型的)变量和 if 语句内部使用位移位的问题,但不幸的是,我无法得出明确的结论,这是否是一个错误与否。
我假设如果它是错误,那么它是语义错误或 运行-time 错误。
但这一定是错误的吗?
这不是语法错误。 if
需要带括号的表达式。 (int_x<<int_y)
满足。 shift 表达式可能会导致运行时错误,但前提是 int_x
和 int_y
的特定值会调用未定义的行为(请参阅 6.5.7 了解何时可能发生)。
如果x
是无符号整数类型,至少和unsigned int
一样大,并且y
小于x
的位数' s 类型,那么上面的部分语句将测试是否设置了 x
中 不是 顶部 y
中的位。如果 x
是有符号类型或小型无符号类型,C89 标准将要求实现行为类似,但需要注意的是,设置小型有符号类型的最高位被视为设置所有超出的位。但是,C99 和更高版本的标准不要求实现有效地处理 x
是 non-zero 但表达式 x<<y
将产生零的任何情况,除非 x
是至少与 unsigned int
.