C中的括号可以导致隐式演员吗?

tal*_*ity 7 c type-conversion bitwise-operators parentheses

背景

我最后一次询问括号是否导致隐式转换(这里)时,@ pmg足以指出"C中的任何内容都不在int下面"但是那里,讨论是关于按位运算符,括号结果是只是一个分心.

介绍

下面,括号是主要的吸引力.或者,为了更无聊但更精确,我看到的唯一操作符是括号和赋值运算符.

在这个关于C括号运算符的引用中,我没有看到关于改变类型的括号的任何内容(在类型转换语法之外,这不是这种情况).

同时,这里的提醒,有一个基准上分配自动类型转换,但我不认为这会解释静态分析工具的行为,我将在这里描述.

正如我刚才的问题,"OK"指的是静态分析工具,并没有警告的隐式类型转换,而"不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);
}
Run Code Online (Sandbox Code Playgroud)

除了前两个,我能理解它们 - 括号有什么作用?如果他们没有采取隐式类型转换的方式,那么我希望(1)没问题,(2)不行.如果他们对int小于int的类型进行自动类型提升,那么我希望(1)不正常,(2)没问题.但是这个工具说两者都不行.

这是一个静态分析工具错误,还是工具正确,我还需要了解C中隐式类型转换的其他内容?

(顺便说一句,我希望值256足够小,不会导致我的机器溢出......)

Kei*_*son 8

首先,让我们澄清一些术语.没有什么可以导致"隐性演员",因为没有这样的事情.甲铸造是一个明确的操作者,其由类型名的括号中的表达式前,如(double)42; 它指定转换.转换可以是显式的(由强制转换运算符指定),也可以是隐式转换,如double x = 42;.所以你真正要问的是括号是否会导致隐式转换.

答案,至少在你向我们展示的代码中,答案是否定的.

引用C99标准(3.7 MB PDF),第6.5.1p5节:

带括号的表达式是主表达式.它的类型和值与未表示的表达式相同.如果未表示的表达式分别是左值,函数指示符或空表达式,则它是左值,函数指示符或void表达式.

而且既然256U已经是一个primary expression,括号根本就没有区别; 括号通常表示优先级,但在这种情况下,没有预先指示.

你使用什么静态分析工具?您应该提交错误报告.