2017-04-25 55 views
0

我有一个代码片段,我给变量赋值var。在变量之间进行左/右移操作。这样的变量是否可以变为空?c/C++中的左移或右移操作可以使变量变为空吗?

需要注意的是空主要是定义为

#define null ((void*)0)

如果它不能为空,然后进行检查,如:

if (var == null) 

会产生死代码,这将永远是执行。

+1

什么是“大多数定义”在“空主要定义为”应该是什么意思? – AnT

+0

我认为在大多数C++编译器中,NULL被定义为0.显然'null'不是标准定义,所以可以定义为任何东西。没有完整的代码,很难说,但我会争辩说,如果该值变为零,那么它将匹配'null'或'NULL'定义 - 尽管有警告。 –

回答

2

内置移位运算符仅适用于值为积分或无标寸枚举类型。与您的null相比的内置比较仅适用于指针类型的值。这意味着内置转换的结果永远不能与您的null进行比较。 (这里唯一的潜在漏洞是可以使用shift来形成一个空指针常量 - 一个整数零,但这只能在pre-C++ 11版本的语言中才能实现,现在不能再用了。)这种比较是无效的。

换句话说,这个问题甚至都不存在。您的if不会产生“死码”或“存活码”。它根本不会编译。

但是,如果您正在谈论重载操作员,那么一切皆有可能。但是,在这种情况下,您的问题太过宽泛,无法理解。

+0

分配给var的值是一个指针,并在该逻辑操作上完成,如移位和位智。那么可能呢。 – user3552519

+0

@ user3552519:不能。对C++中的指针执行“移位和位智”操作是不可能的。 C++中的移位和按位操作只适用于整型和枚举类型。 – AnT

+0

难道我们不能指定一个指针地址并对它进行逻辑运算吗? – user3552519

1

在C中,您可以将整数值与指针进行比较,以便代码生成警告,但可能按预期工作。 (绝对不建议,虽然)

+0

除了整数零常数以外,您不能合法地将整数值与C中的指针进行比较。C语言没有此类功能。 – AnT

+0

@AnT众所周知,在C语言中定义的内容与C编译器实际接受的源代码之间存在差异。 –

+0

这取决于你的意思是“接受”。 C编译器需要发出诊断消息来响应不正确的代码。他们这样做。之后所有投注都关闭。那是“接受”还是“拒绝”? – AnT