如果我使用逗号运算符编写代码,如下所示:
int i;
i = 5, i++, i++;
Run Code Online (Sandbox Code Playgroud)
它会调用未定义的行为吗?
不会.它不会调用未定义的行为,因为在评估逗号运算符的左右操作数之间存在一个序列点.
=优先级高于,运算符的优先级,因此5将绑定为=as
(i = 5), i++, i++;
Run Code Online (Sandbox Code Playgroud)
由于保证评估来自左到右逗号操作的操作数,i = 5将首先评估和i将被分配5,则该第二个表达式i++将被评估并且i将6最后的第三个表达式将递增i到7.
以上陈述相当于
i = 5;
i++;
i++;
Run Code Online (Sandbox Code Playgroud)
它会调用未定义的行为吗?
不,因为逗号运算符引入的序列点和运算符优先级.一个序列点保证所有的副作用先前评价已经评估以下表达式之前执行.
序列点和运算符precende确保在i = 5, i++, i++;语句中,在评估任何表达式之前i将初始化i++.
该声明:
i = 5, i++, i++;
Run Code Online (Sandbox Code Playgroud)
是,考虑运算符优先级,相当于:
((i = 5), i++), i++;
Run Code Online (Sandbox Code Playgroud)
所以,首先(i = 5)要评估.后它的副作用是在(即:后i被初始化到5),下面的表达式,i++被求值.同样,在最后一个表达式引入的副作用结束后(即:i增加1),将i++评估最后一个表达式.