这个程序有任何序列点问题吗?

#include int main() { int i=7,j; j=(i++,++i,j*i); return 0; } 

j =(i ++,++ i,j * i);这个定义得很好吗? 让我明白我的疑问。

这个表达式没问题,因为逗号运算符是一个序列点 :

 (i++, ++i, j*i) 

但是,不要将它与逗号不作为序列点的以下内容混淆:

 somefunction(i++, ++i, j*i) 

怎么样j = i ++ * ++ i

乘法运算符不是序列点。


请原谅我劫持你的答案

从ISO 9899:1999(C标准)的§3.4开始:

3.4行为

外表或行动

3.4.1实现定义的行为

未指定的行为,其中每个实现记录了如何进行选择

示例实现定义的行为的示例是当有符号整数向右移位时高阶位的传播。

3.4.2特定于语言环境的行为

每个实施文件都依赖于当地的国籍,文化和语言惯例的行为

示例特定于语言环境的行为的示例是,对于除26个小写拉丁字母之外的字符,islower函数是否返回true。

3.4.3未定义的行为

行为,在使用不可移植或错误的程序结构或错误数据时,本国际标准不对此要求

注意可能的未定义行为包括完全忽略具有不可预测结果的情况,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止转换或执行(使用发出诊断信息)。

示例未定义行为的示例是整数溢出的行为。

3.4.4未指明的行为

本国际标准提供两种或更多种可能性并且在任何情况下都没有选择进一步要求的行为

示例未指定行为的示例是计算函数参数的顺序。

是的,它定义明确。 序列点

C中的逗号运算符

在您的代码中,“,”将作为序列点工作。

所以在这

 j=(i++,++i,j*i); 

表达将从左到右工作。
所以首先是i ++然后是++ i然后是j * i

在最后j *我将存储在j;

但最后你的结果会很优雅,因为“j”没有预定义的数据
所以未定义的值将存储在j中。

如果你不使用“()”

您的代码将作为单个语句工作,例如

 j=i++; ++i; j*i;