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

时间:2010-08-28 09:10:53

标签: c operator-precedence sequence-points

#include<stdio.h>
 int main()
 {  
       int i=7,j;
       j=(i++,++i,j*i); 
       return 0;
}

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

3 个答案:

答案 0 :(得分:10)

这个表达式没问题,因为comma operatorsequence point

(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特定于语言环境的行为

     行为取决于各自的国籍,文化和语言的地方惯例   实施文件

     

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

     

3.4.3未定义的行为

     

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

     

注意可能的未定义行为包括完全忽略不可预测的情况   结果,在翻译或程序执行过程中以文件化的方式表现   环境(有或没有发出诊断信息),终止翻译或   执行(发出诊断信息)。

     

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

     

3.4.4未指明的行为

     

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

     

示例未指定行为的示例是函数的参数的顺序   评价。

答案 1 :(得分:4)

是的,它的定义很明确。 sequence point

comma operator in C

答案 2 :(得分:1)

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

所以在这个

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

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

在最后一个j * i将存储在j中;

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

如果你不使用“()”

您的代码可以作为单个语句使用,例如

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