C语言中带关系运算符的前缀与后缀。运算符关联性如何影响?

C语言中带关系运算符的前缀与后缀。运算符关联性如何影响?,c,C,根据关联性规则,++前缀是从右向左关联的,而后缀++是从左向右关联的。在下面的代码中,我尝试了这两个选项以及一个关系(在++I

根据关联性规则,++前缀是从右向左关联的,而后缀++是从左向右关联的。在下面的代码中,我尝试了这两个选项以及一个关系(在
++I<5
中,
++I
确实是首先计算的。我不知道为什么您认为不会发生这种情况


j++<5
中,表达式
j++
的值也是首先计算的,但是表达式的值是预先递增的值(实际上增量可能会晚一点发生,但这是另一回事)。
j++
(++j-1)非常相似

一元运算符的关联性没有意义,因为它们是一元运算符。根据定义,关联性是二元运算符的一个特征

将后缀运算符标记为右关联运算符,将前缀运算符标记为左关联运算符是一种传统做法。毫无疑问,这种做法是有原因的,但实际上并不重要。[注1]

在任何情况下,优先级实际上与求值顺序无关。在
f(a)+f(b)*f(c)
中,对
f
的三次调用可以以任何顺序发生,并且
f(a)
可以在乘法之前或之后调用。显然,必须在应用使用操作数的运算符之前求值操作数(短路运算符除外),但这只与优先级有切点关系。优先级实际上只告诉您,如果要使表达式明确无误,必须将括号放在何处

笔记
  • 如果您正在使用bison/yacc的优先功能(如果没有,请忽略此注释)如果您不想用
    %prec prefix
    手动标记前缀产品,那么您可以选择将所有一元运算符标记为具有相同优先级的右关联运算符。这将使后缀运算符比前缀运算符绑定更紧密,这是通常的约定。不过,它更常见(而且,我认为,更合理)将它们分为不同的级别,使优先级更明确。具有多个语法(前缀/infix
    -
    或前缀/postfix
    ++
    的运算符需要将其前缀版本标记为
    %prec
    。这些都没有任何形式意义

  • 首先,关联性和优先级不决定求值顺序。其次,
    ++i
    j++
    做同样的事情,但前者返回
    i
    的新(递增)值,后者返回旧(递增前)值
    j
    的值。如果不优先,那么什么决定求值顺序?是的,必须先求值参数
    ++i
    5
    ,然后运算符
    才能理解您将语句视为“小于”的意思函数,其中参数必须在函数之前求值。但是“++i<5”中的“++i”不是在函数之前求值吗“首先,在表达式
    ++i<5
    中,
    ++i
    5
    都是在
    之前首先求值的。您是对的,在第10次查看之后,现在我看到了。很抱歉,这有点混淆。
    
    (++i < 5)
    
    "++i"
    
    "++i < 5" 
    
    #include <stdio.h>
    
    int main(){
        int i = 0, j = 0;
        while (++i < 5)
        {
            printf("%d ", i);
        }
        puts("");
        while (j++ < 5)
        {
            printf("%d ", j);
        }
    
    
        return 0;
    }
    
    1 2 3 4
    1 2 3 4 5