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

Jag*_*gan 1 c operator-precedence sequence-points

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

j =(i ++,++ i,j*i);这个定义得很好吗?让我清楚我的怀疑.

Mar*_*ers 10

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

(i++, ++i, j*i)
Run Code Online (Sandbox Code Playgroud)

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

somefunction(i++, ++i, j*i)
Run Code Online (Sandbox Code Playgroud)

怎么样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未指明的行为

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

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