背景
上次我问到括号是否导致隐式转换( here )时,@pmg 很好地指出“C 中没有在 int 下做任何事情”但是在那里,讨论是关于按位运算符的,括号结果是只是分散注意力。
简介
下面,括号是主要的吸引力。或者,更无聊但更精确的是,我看到的唯一运算符是括号和赋值运算符。
At this reference about the C parentheses operator ,我没有看到任何关于括号改变类型的东西(在类型转换语法之外,这不是这种情况)。
同时, here's a reference that reminds that there is automatic type conversion on assignment ,但我认为这不会解释我将在此处描述的静态分析工具行为。
就像在我之前的问题中一样,“确定”表示静态分析工具没有警告隐式类型转换,而“否确定”意味着它确实做了警告。
int main(void)
{
unsigned int ui;
int i;
ui = (256U); // NOT OK (*) (1)
i = (256U); // NOT OK (*) (2)
i = 256; // OK
i = 256U; // NOT OK
ui = 256U; // OK (3)
ui = 256; // NOT OK
return(0);
}
除了前两个,我都能理解它们——括号有什么作用?如果他们不采取隐式类型转换的方式,那么我期望(1)可以,而(2)不能。如果他们对小于 int 的类型进行自动类型提升到 int,那么我希望 (1) 不正常,(2) 正常。但是这个工具说两者都不行。
这是静态分析工具错误,还是该工具正确,我还需要了解 C 中的隐式类型转换?
(顺便说一句,我希望值 256 足够小,不会在我的机器上造成溢出......)
最佳答案
首先,让我们澄清一些术语。没有什么可以导致“隐式转换”,因为没有这样的东西。强制转换是显式运算符,由表达式前括号中的类型名称组成,例如 (double)42
;它指定了一个转换。转换可以是显式的(由强制转换运算符指定)或隐式的,如 double x = 42;
。所以你真正要问的是括号是否会导致隐式转换。
至少在您向我们展示的代码中,答案是否定的。
引用 C99 standard (3.7 MB PDF),第 6.5.1p5 节:
由于 256U
已经是 primary expression
,括号没有任何区别;括号通常表示优先级,但在这种情况下没有优先级表示。
你用的是什么静态分析工具?您可能应该提交错误报告。
关于C 中的括号会导致隐式转换吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7456872/