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

j=(i++,++i,j*i);这个定义好了吗?让我清除我的疑问。

4

3 回答 3

10

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

(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 函数是否对 26 个小写拉丁字母以外的字符返回 true。

3.4.3 未定义的行为

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

注意 可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(使用发出诊断消息)。

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

3.4.4 未指明的行为

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

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

于 2010-08-28T09:14:57.480 回答
4

是的,它的定义很好。 序列点

C中的逗号运算符

于 2010-08-28T09:11:59.173 回答
1

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

所以在这个

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

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

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

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

如果你不使用“()”

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

j=i++;
++i;
j*i;
于 2010-08-28T18:15:17.317 回答