#include<stdio.h>
int main()
{
int i=7,j;
j=(i++,++i,j*i);
return 0;
}
j =(i ++,++ i,j * i);这个定义得很好吗?让我明白我的怀疑。
答案 0 :(得分:10)
这个表达式没问题,因为comma operator是sequence 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
答案 2 :(得分:1)
在您的代码中,“,”将作为序列点工作。
所以在这个
j=(i++,++i,j*i);
表达式将从左到右工作 所以首先是i ++然后是++ i然后是j * i
在最后一个j * i将存储在j中;
但最后你的结果会很优雅,因为“j”没有预定义的数据
所以未定义的值将存储在j中。
如果你不使用“()”
您的代码可以作为单个语句使用,例如
j=i++;
++i;
j*i;