背景

上次我问到括号是否导致隐式转换( 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/

10-13 08:20
查看更多