C 一元运算符的优先级是否高于强制转换表达式?

C 一元运算符的优先级是否高于强制转换表达式?,c,casting,operator-precedence,unary-operator,C,Casting,Operator Precedence,Unary Operator,我一直在通过著名的书《C premier plus第六版》学习C,我对一元运算符的优先级和强制表达式有些困惑 ,本书中下面提到的表的位置是B:参考第二节:C运算符——表RS.II.1 根据书中的表格,与一元运算符相比,强制转换表达式的优先级似乎更低。所以我对它进行了一个简单的测试,不知怎么的,它们似乎有着相同的优先级。下面是测试文件: #包括 #包括 内部主(空) { /*将int强制转换为char时,我们利用了截断(只保留int的较低8位),如果强制转换首先执行,则值为0,因此最终输出为1。相

我一直在通过著名的书《C premier plus第六版》学习C,我对一元运算符的优先级和强制表达式有些困惑

,本书中下面提到的表的位置是
B:参考第二节:C运算符——表RS.II.1

根据书中的表格,与一元运算符相比,强制转换表达式的优先级似乎更低。所以我对它进行了一个简单的测试,不知怎么的,它们似乎有着相同的优先级。下面是测试文件:

#包括
#包括
内部主(空)
{
/*将int强制转换为char时,我们利用了截断(只保留int的较低8位),如果强制转换首先执行,则值为0,因此最终输出为1。相反,我们得到0作为最终结果*/
int检验=512;
printf(“test1-1是%d\n”,!(char)test);/*test1-1是1*/
printf(“test1-2是%d\n”,(char)!test);/*test1-2是0*/
getchar();
返回0;
}
在这个测试文件中,我选择一元运算符作为表示。当然,还有其他一元运算符,但它们都有很好的理由不参与此测试:

  • ++、--和&:它们只能使用左值作为操作数,这不是强制转换表达式可以安排的
  • -、+和~:我们可以声明一个长整型变量并将其转换为整型变量,也许截断可以告诉我们一些事情。不幸的是,我们不能从中找到任何东西,做一些基本的数学运算,你会发现是一元运算符先执行还是cast先执行,它不会改变输出
  • 其他人:对我来说毫无意义
以下是我的环境设置: gcc版本:
gcc(tdm-1)5.1.0
操作系统:windows7

我添加了一些命令选项,如
-std=c90
-std=c99
-std=c11
,它们都会产生与测试文件中的注释相同的输出。这很奇怪,所以我转向C11标准文档寻求帮助,相关信息非常有用。以下是信息:

1.语法指定表达式求值时运算符的优先级,这是相同的 作为本款主要子条款的顺序,最高优先级优先

2.例外情况是作为一元运算符操作数的强制转换表达式(6.5.4)和

这解释了很多,但行为是相同的,如果他们共享相同的优先级。那么,为什么不把它们放在一起,避免误导呢?
仅仅因为强制转换表达式不属于一元运算符,并且为了保持toc干净,我们必须给强制转换表达式不同的优先级?这有点强迫症。

让我们关注一下您在测试中分析的操作符。逻辑不是
运算符和强制转换运算符
(类型)
的优先级相同

如中所示,它们都具有优先级#2
您需要了解发生了什么,还需要考虑到关联性。关联性表示具有相同优先级的运算符的求值顺序。
我们正在讨论的运算符具有从右到左的关联性

为了清晰起见,我将复制您的测试:

int main(void)
{
    /*we take advantage of the truncation when casting int to char(only remains the lower 8 bit of the int), if the cast executes first, the value is 0 so the final output is 1. Conversely, we get 0 as the final result.*/
    int test = 512;
    printf("test1-1 is %d\n",!(char)test); /*test1-1 is 1*/
    printf("test1-2 is %d\n",(char)!test); /*test1-2 is 0*/

    getchar();
    return 0;
}
  • 中!(char)test
    ,从右到左的关联性表示首先执行强制转换。这将导致值“自适应”到
    char
    大小,从而产生值
    0

    然后应用逻辑求反,得到值
    1

  • (char)!测试
    ,从右到左的关联性意味着首先执行逻辑求反。这将导致值
    !512,导致值
    0

    然后应用强制转换,再次生成值
    0


  • 由于这些原因,您实际上得到了预期的结果。

    您可以在这里找到答案:@Jabberwocky谢谢,伙计!你最后提供的桌子有些道理。