使用之前 void cast 的变量是否有效?
Is is valid to use a variable previously void casted?
看起来这段代码可以被 gcc 接受,尽管标准规定表达式的值在 void 转换的情况下被丢弃。
#include <iostream>
int f(int i) {
int a = i*2;
(void)a;
a++; // looks OK even after void cast
return a; // looks OK even after void cast
}
int main() {
std::cout << "f(5): " << f(5) << "\n"; // displays 11
return f(5);
}
那么通常可以使用更改已被无效转换的变量的值,那么在这种情况下“丢弃”是什么意思?或者依赖它是一种不好的做法?
表达式的结果被丢弃,在您的情况下,这意味着 (void)a
的结果被丢弃。这通常用于避免未使用的变量(或未使用的 return 值)警告。在 (void)a
之后使用 a
是完全没问题的,但是首先使用 (void)a
是没有意义的。
编辑:解决评论中提出的一些问题。 standard 的确切写法是:
Any expression can be explicitly converted to type cv void. The
expression value is discarded.
在这种情况下,a
是表达式,它被强制转换为 void
,它会丢弃表达式的结果,因此 “(void)a 的结果”。 =27=] 从技术上讲是不正确的: a
的结果被丢弃,因为它被转换为 void
- 但也可以认为转换本身的结果被丢弃(本质上,演员什么都不做)。
看起来这段代码可以被 gcc 接受,尽管标准规定表达式的值在 void 转换的情况下被丢弃。
#include <iostream>
int f(int i) {
int a = i*2;
(void)a;
a++; // looks OK even after void cast
return a; // looks OK even after void cast
}
int main() {
std::cout << "f(5): " << f(5) << "\n"; // displays 11
return f(5);
}
那么通常可以使用更改已被无效转换的变量的值,那么在这种情况下“丢弃”是什么意思?或者依赖它是一种不好的做法?
表达式的结果被丢弃,在您的情况下,这意味着 (void)a
的结果被丢弃。这通常用于避免未使用的变量(或未使用的 return 值)警告。在 (void)a
之后使用 a
是完全没问题的,但是首先使用 (void)a
是没有意义的。
编辑:解决评论中提出的一些问题。 standard 的确切写法是:
Any expression can be explicitly converted to type cv void. The expression value is discarded.
在这种情况下,a
是表达式,它被强制转换为 void
,它会丢弃表达式的结果,因此 “(void)a 的结果”。 =27=] 从技术上讲是不正确的: a
的结果被丢弃,因为它被转换为 void
- 但也可以认为转换本身的结果被丢弃(本质上,演员什么都不做)。