背景
我最后一次询问括号是否导致隐式转换(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,但我认为这不会解释我将在此处描述的静态分析工具行为。
与前一个问题一样,“OK”表示静态分析工具不警告隐式类型转换,“NOT OK”表示它确实
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足够小,不会导致我的机器溢出......)
答案 0 :(得分:8)
首先,让我们清楚一些术语。没有什么可以导致“隐性演员”,因为没有这样的事情。 强制转换是一个显式运算符,由表达式前面括号中的类型名称组成,例如(double)42
;它指定转换。转换可以是显式的(由强制转换运算符指定)也可以是隐式的,如double x = 42;
中所示。所以你真正要问的是括号是否会导致隐式转换。
至少在您向我们展示的代码中,答案是否定的。
引用C99 standard(3.7 MB PDF),第6.5.1p5节:
带括号的表达式是主表达式。它的类型和价值 与未表达的表达相同。它是一个 左值,函数指示符,或者如果是,则表示空值表达式 未表示的表达式分别是左值,一个函数 指示符,或无效表达。
由于256U
已经是primary expression
,因此括号根本没有区别;括号通常表示优先级,但在这种情况下,没有预先指示。
您使用的是什么静态分析工具?您应该提交错误报告。
答案 1 :(得分:4)
该工具以某种方式混淆。这里没有铸造。这些括号只表示优先顺序。