我最后一次询问括号是否导致隐式转换(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足够小,不会导致我的机器溢出……)
解决方法
至少在你向我们展示的代码中,答案是否定的.
引用C99 standard(3.7 MB PDF),第6.5.1p5节:
A parenthesized expression is a primary expression. Its type and value
are identical to those of the unparenthesized expression. It is an
lvalue,a function designator,or a void expression if the
unparenthesized expression is,respectively,an lvalue,a function
designator,or a void expression.
因为256U已经是主要表达式,所以括号根本没有区别;括号通常表示优先级,但在这种情况下,没有预先指示.
你使用什么静态分析工具?您应该提交错误报告.