黑马程序员技术交流社区
标题:
非常非常easy!却非常容易出错!又让人很疑惑的小问题
[打印本页]
作者:
Raymond1011
时间:
2013-11-30 20:35
标题:
非常非常easy!却非常容易出错!又让人很疑惑的小问题
先声明,我只是一个初学者!
而后我用的是vc++6.0编译器,所以书写格式是按照c语言写的、
废话不多说,先上代码:
#include "stdafx.h"
#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);
return 0;
//最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?
}
作为一个初学者我很迷惑这样的看起来非常简单小问题,求各位大神解答,小弟不胜感激!
作者:
qq379264347
时间:
2013-11-30 23:53
本帖最后由 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
*/
复制代码
作者:
刘敏
时间:
2013-12-1 00:47
本帖最后由 刘敏 于 2013-12-1 00:49 编辑
int main(int argc, char* argv[])
{
int i;
i=0;
int n = 0;
// n = i++;
//上面的不说,非常简单的变量定义没有问题。可是下面问题就来了、
n=(i++); //按理说“()”的运算优先级是高于“=”为什么运算出来的结果是“n=0”
(这里是后置++,也就是先把i的值给n,然后自己加1, 此时i先把0给n,然后i变成1 )
n==i++; //这行代码是我故意写错的,为什么能正常通过编译?并且i实现了自增的运算,难道这行代码没有写错吗?
(这句话的意思是比较 n 和i++ 的值是否相等,可以编译通过,这句话不会改变n的值 )
printf("i = %d\n",i);
printf("n = %d\n",n);
return 0;
//最后一个问题为什么我注释“n=(i++)”或“n = i++”任意一行,运行的结果“n=0”,而当这两行都能正常执行却是“n=1”这两行之间有什么必要的联系吗?
(很有联系,第一句话执行后,n=0, i=1;第二句话执行的时候,是i先把刚才的1又给n,n=1,然后自己i自己+1,最后i=2 )
}
作为一个初学者我很迷惑这样的看起来非常简单小问题,求各位大神解答,小弟不胜感激!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2