【发布时间】:2013-07-15 03:11:02
【问题描述】:
请考虑以下陈述:
int a[]={1,2,3,4,5,6,7,8};
int i=0,n;
n=a[++i] + i++ + a[i++] + a[i] ;
根据我的逻辑,n 应该是 10。但是我在 c 中得到不同的输出(输出为 7) 但是在 java 中,我得到的预期结果是 10。增量和减量运算符在 c 和 java 中的工作方式有什么不同。
这是我的确切 c 和 java 代码:
#include <stdio.h>
int main()
{
int a[]={1,2,3,4,5,6,7,8};
int i=0,n;
n=a[++i] + i++ + a[i++] + a[i] ;
printf("%d",n);
getch();
return 0;
}
带有输出的Java代码:10
public class HelloWorld{
public static void main(String []args){
int a[]={1,2,3,4,5,6,7,8};
int i=0,n;
i=0;
n=a[++i] + i++ + a[i++] + a[i] ;
System.out.println(n);
}
}
【问题讨论】:
-
Java 设计者选择精确定义所有增量等情况的结果,尽管 JLS 建议在一个语句中避免多重副作用。 C++ 标准未定义某些情况。
-
您的意思是结果是 7 而不是 10 的原因是所谓的“c 的未定义行为”实际上如果您从右到左而不是从左到右评估表达式,则答案可以是 7。您确定它与运算符关联性无关吗?
-
有趣的是,每个人都提出了同样的问题。更何况他们都遇到了未定义的行为。也许C应该被称为未定义的语言。
-
有谁会写出这样的代码?
-
比@duffymo 直率一点——不要这样写代码。我当然希望这个问题只是出于好奇,而不是你在实践中实际做的事情。
标签: java c expression post-increment pre-increment