7

背景

上次我询问括号是否导致隐式转换(此处)时,@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 足够小,不会导致我的机器溢出......)

4

2 回答 2

8

首先,让我们澄清一些术语。没有什么可以导致“隐式转换”,因为没有这样的事情。强制转换是一个显式运算符,由表达式前面括号中的类型名称组成,例如(double)42; 它指定一个转换。转换可以是显式的(由强制转换运算符指定)或隐式的,如double x = 42;. 所以你真正要问的是括号是否会导致隐式转换

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

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

带括号的表达式是主要表达式。它的类型和值与无括号表达式的相同。如果不带括号的表达式分别是左值、函数指示符或 void 表达式,则它是左值、函数指示符或 void 表达式。

既然256U已经是 a primary expression,括号根本没有区别;括号通常表示优先级,但在这种情况下没有优先级表示。

你用的是什么静态分析工具?您可能应该提交错误报告。

于 2011-09-17T19:11:01.780 回答
4

该工具不知何故被混淆了。这里没有选角。这些括号只是表示优先级。

于 2011-09-17T18:21:22.563 回答