我的一位朋友问我以下问题,但我不确定如何回答......
“考虑一下这句话:
int* p;
...(假设p设置为指向有意义的东西)
*p++;
该语句首先将p递增1,然后取消引用它。但问题是,当我编译它时,我收到了这个警告:
ex-9-frepe.cc:28:9:警告:未使用计算值[-Wunused-value]
*p++;
......这很有道理。我不使用那个值。
在有问题的练习中,你应该完全填充声明,所以我做了:
(*(p++));
随之而来的是,警告消失了。这很奇怪,你明白为什么吗?我还没有使用这个值。
使用此括号:
*(p++);
......警告仍然存在。“
我的假设是编译器被最终值括号“(*(p ++))”所欺骗,并认为这被认为是“使用”。但我完全不确定,所以我决定将这个话题引发辩论......
答案 0 :(得分:1)
*p++;
该语句首先将p递增1,然后取消引用
实际上它会取消引用p
的原始值。
此外,这两个步骤之间没有定义顺序关系;即,通常可以在之前或之后执行增量,只要原始值被解除引用即可。但在这种情况下,两种可能的顺序之间的可观察行为没有区别。
您的其他版本的代码都具有完全相同的定义行为。警告是可选的(即C标准没有规定);最可能的解释是你的编译器试图通过给出第一个代码的警告来提供帮助;并且它认为如果你抛出多余的括号,那么你正试图使警告静音。 (不幸的是,这是关于警告的一种相当常见的技术)。
如果不清楚:警告是由于解除引用操作未使用的结果(与增量没有任何关系);代码*p;
应该给出相同的警告。
要获得更准确的答案,您需要发布编译器的名称和版本号。
将冗余括号视为关于警告的“元数据”的编译器的另一个常见示例是:
if ( a = b ) // warning, did you mean '==' ?
if ( (a = b) ) // no warning - assume he really did mean '='