“(int) a”和“int(a)”之间有什么区别?

7

((int) a)(int(a))有什么区别?

在纯“C”(不是“C++”)中,第二个表达式是否有效?


2
在“纯C”中检查某些东西是否有效的好方法是使用-std=c11 -pedantic-errors(或者您编译器的等效选项)进行编译。这将给出正确的答案99%的时间。 - StoryTeller - Unslander Monica
4
@Evg - 我脑海中暂时想不起来。但编译器有时仍然会存在一些符合性错误,因此我的错误率为1%。 - StoryTeller - Unslander Monica
1
你所说的“pure C”是指“C”吗? - M.M
“C++下的C”这种说法是不存在的。C和C++是非常不同的编程语言,即使使用C++编译器编译C代码,也必须遵循C语言的规则。 - phuclv
这个回答是否解决了你的问题?C++强制类型转换语法风格 - phuclv
显示剩余7条评论
2个回答

7

C++ 中它们之间没有区别。然而,C 仅支持第一种强制类型转换操作。

参见来自教程的示例:

double x = 10.3;
int y;
y = (int) x;    // c-like cast notation 
y = int (x);    // functional notation

3

(type_name)identifier(更确切地说是(type_name)cast_expression(6.5.4))是C风格的转换。在C中,(int(a))在语法上无效,除非a是一种类型。然后它可以成为转换的一部分,转换为一个接受类型为a且返回int的函数,这将是一个在语法上有效但在语义上无效的转换,也是无用的。在C中,int(a);将是等同于int a;的声明。

C ++确实支持int(a)的语法用于转换(类型名称必须是单个单词;不能使用例如unsigned long(a)等),因为在这种情况下,int(类型名称)就变成了一种具有参数化构造函数的类型(尽管即使在C ++中,这也与C风格的转换一起作为一种已弃用的转换方式进行分组,更细粒度/可见的static_cast/reinterpret_cast/const_cast转换被优先采用)。

然后,C++的语法似乎非常有趣,因为这个是有效的(C ++):

typedef int type_name;
type_name (a); //a declaration
a=0;
printf("%d\n", type_name(a)); //type_name(a) is a cast expr here

2
int(a)不就是一个匿名的int对象,其构造函数的参数为a吗?就像string("abc")是用char* "abc"参数构造的匿名字符串一样。 - Christophe
@Christophe 是的,总体来说这更有意义一些。 - Petr Skocik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接