本帖最后由 qq379264347 于 2013-11-30 23:56 编辑
首先我把你的C源码进行了修改,你看一下输出结果,也许会明白很多。
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- int i;
- i=0;
- int n = 0;
- // n = i++;
-
- //上面的不说,非常简单的变量定义没有问题。可是下面问题就来了、
- n=(i++); //按理说“()”的运算优先级是高于“=”为什么运算出来的结果是“n=0”
- n==i++; //这行代码是我故意写错的,为什么能正常通过编译?并且i实现了自增的运算,难道这行代码没有写错吗?
- printf("i = %d\n",i);
-
- printf("n = %d\n",n);
- if(n==i++)
- printf("true");
- else
- printf("n = %d, i = %d\n",n,i);
-
- n=4;
-
- if(n==++i)
- printf("true\n");
- else
- printf("n = %d, i = %d\n",n,i);
-
- return 0;
- //最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?
- }
复制代码
最后输出信息如下:
- i = 2
- n = 0
- n = 0, i = 3
- true
复制代码
再来回答一下你的问题。
运算符 = 是赋值运算符,并不是简单的等于号,也不是等于运算,等于运算进行判断的话是两个等于号 == 。
赋值运算符 = 是把等号右面的值给左面的变量。
这个右面可以是数值,也可以是表达式,若是表达式的话,是把表达式的值给左面。
int n = 0;
n = 1+5+5;
这时候很明显,n值是11了,那么你加个括号呢?
n = 1+(5+5);
还是11,可能举例不好,看下面:
int n = 0;
n = 2+2*5+1+0;
与
n = (2+2)*5+1+0;
值就不一样了。
n=(i++);可以理解为n=(i++)+0; 你这个括号其实不起任何作用的。
i++的表达式值就是i没有自增的原始值。
至于n==i++;嘛,你看了我上面的c源码,可能会明白很多吧。这句就是一个if里的判断句。
在c语言中编译通过的,但是在java中就编译报错了,可能java更严谨吧,对语法要求比c严格,比如c中可以用非0代替if里的真值,但java中必须是true。
我改了一下java源码,你看一下吧:
- public class zcb {
- public static void main(String[] args) {
- int i;
- i = 0;
- int n = 0;
- n=(i++);
- System.out.println("n = " + n); //n = 0
- System.out.println("i = " + i); //i = 1
- //n==i++; 编译提示该处 “不是语句”
- if(n==i++); //if里没有实际代码,但有分号,可以编译运行
- System.out.println("n = " + n); //n = 0
- System.out.println("i = " + i); //i = 1
-
- System.out.println(n==i++);
- }
- }
- /*
- 输出结果:
- n = 0
- i = 1
- n = 0
- i = 2
- false
- */
复制代码
|