背景
上次我询问括号是否导致隐式转换(此处)时,@pmg 很好地指出“C 中没有在 int 下完成任何事情”但是在那里,讨论是关于位运算符的,括号结果是只是分散注意力。
介绍
下面,括号是主要的吸引力。或者,更无聊但更准确地说,我看到的唯一运算符是括号和赋值运算符。
在这个关于 C 括号运算符的参考中,我没有看到任何关于括号改变类型的内容(在类型转换语法之外,这不是这种情况)。
同时,这里有一个参考,提醒在 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) 不是 OK 并且 (2) 是 OK。但是这个工具说两者都不行。
这是静态分析工具错误,还是工具正确,我还需要了解有关 C 中的隐式类型转换的其他内容?
(顺便说一句,我希望值 256 足够小,不会导致我的机器溢出......)