关于未使用值的警告并不总是出现

Warning about not used value does not always appear

本文关键字:警告 未使用      更新时间:2023-10-16

我的一个朋友问了我下面的问题,但我不知道如何回答…

"考虑这个语句:

int* p;

…(让我们假设p被设置为指向有意义的东西)

*p++;

该语句首先将p加1,然后对其解引用。但问题是,当我编译这个时,我得到了这个警告:

ex-9-frepe。cc:28:9:警告:value computed not used [- unused-value]

*p++;

…这是有道理的。我不使用这个值。

在上面的练习中,你应该把语句完全括起来,所以我这样做了:

(*(p++));

这样,警告就消失了。这很奇怪,你知道为什么吗?我仍然没有使用值。

加上括号:

*(p++);

…警告依然存在。"

我的假设是编译器被最终值被括号括起来"(*(p++))"这一事实欺骗了,并认为这被认为是"使用"。但是我一点也不确定,所以我决定把这个话题拿出来辩论……

*p++;

该语句首先将p加1,然后对其解引用

实际上它将解引用p的原始值。

并且,这两个步骤之间没有定义排序关系;也就是说,在一般情况下,只要原始值被取消引用,增量可以在之前或之后执行。但在这种情况下,两种可能的序列在可观察到的行为上没有区别。

其他版本的代码都具有完全相同的定义行为。警告是可选的(即不是C标准强制要求的);最有可能的解释是,你的编译器试图通过对第一个代码给出警告来提供帮助;它认为,如果你加入多余的圆括号,那么你是在试图使警告沉默。(不幸的是,这是关于警告的一种相当普遍的技术)。

如果这是不清楚的:警告是由于解引用操作未使用的结果(与增量无关);代码*p;应该给出同样的警告。

要得到一个更准确的答案,你需要发布你的编译器的名称和版本号。

另一个编译器将冗余括号视为"元数据"的常见示例关于警告是:

if ( a = b )    // warning, did you mean '==' ?
if ( (a = b) )  // no warning - assume he really did mean '='