duzunchong 发表于 2017-10-8 15:33:13

刚学C语言,遇到个不懂的地方,请大神指点

#include <stdio.h>

void main()
{
        int i = 8;
        printf("%d\n", ++i);
        printf("%d\n", --i);
        printf("%d\n", i++);
        printf("%d\n", i--);
        printf("%d\n", -i++);
        printf("%d\n", -i--);
}


这个输出的结果是9,8,8,9,-8,-9   前面都没问题,最后一行这个-9怎么看都没懂,输出-8之后不是应该首先算上一行没计算的-8+1,然后再计算-((-8)+1),结果不是应该是7吗?为什么会出现-9这个数

WP叶超 发表于 2017-10-8 15:39:58

先从8变成-8,然后i--变成-9

lizechen 发表于 2017-10-8 20:03:46

不妨再打印一下当前的i值,看看结果

丶忘却的年少o 发表于 2017-10-8 20:45:24

你前面的明白应该知道最后第二个 i = 9,因为前面的负号不会影响i本身的,你只是加了负号,没有说 i = -i 是不是,所以 i 的值就是9,最后一行 -i--,很显然自减优先级大,但是 i-- 由于自身算法、、原因是先呈现 i 的值就是9,再加负号,就是-9。
如果懂了麻烦点一下“最佳答案”,不懂点“回复”提问{:10_303:}

shuofxz 发表于 2017-10-8 21:32:03

楼上已经讲的很清楚了,就不再解释了

对于初学者来说,不要花太长时间纠结这种问题,毫无意义,这样的问题只会出在课后练习题或者考试中,对于实际的工程来说根本不会出现这样的代码,自己容易混淆,别人看你的代码也会很不爽

sunnyday 发表于 2017-10-8 22:42:08

++运算符的结合性是从右向左

duzunchong 发表于 2017-10-10 10:03:11

WP叶超 发表于 2017-10-8 15:39
先从8变成-8,然后i--变成-9

感谢!

duzunchong 发表于 2017-10-10 10:03:25

lizechen 发表于 2017-10-8 20:03
不妨再打印一下当前的i值,看看结果

好办法,谢谢!

duzunchong 发表于 2017-10-10 10:15:00

丶忘却的年少o 发表于 2017-10-8 20:45
你前面的明白应该知道最后第二个 i = 9,因为前面的负号不会影响i本身的,你只是加了负号,没有说 i = -i...

感谢您码了这么多字。不好意思一直没上论坛,您的意思是前面的正负号不会影响i本身的值,只有自加自减才会改变i的值是吗?也就是说看i的值不需要看正负号,只需要看是自加还是自减就可以了,也就是说最后一行i的值其实是倒数第二行"i++"也就是8+1, 然后再加一个负号得出的-9,是这样的吗?是这样的话那i如果需要变成-的的话以我现在的水平,就需要数次自检才能得到对吗?

duzunchong 发表于 2017-10-10 10:15:30

shuofxz 发表于 2017-10-8 21:32
楼上已经讲的很清楚了,就不再解释了

对于初学者来说,不要花太长时间纠结这种问题,毫无意义,这样的问 ...

好的,感谢您的回复

duzunchong 发表于 2017-10-10 10:16:07

sunnyday 发表于 2017-10-8 22:42
++运算符的结合性是从右向左

谢谢!

丶忘却的年少o 发表于 2017-10-10 10:52:08

duzunchong 发表于 2017-10-10 10:15
感谢您码了这么多字。不好意思一直没上论坛,您的意思是前面的正负号不会影响i本身的值,只有自加自减才 ...

是的,的确不需要看前面的负号,你可以自己定义一个 i = 9,然后先打印下 -i 的值,然后再打印下 i 的值就可以知道了。不过你要变成负的,可以不需要这么做呀,直接在那个打印命令前写一条 i= -i; 让 i 变成负数就好了。版主的意思那也就是少用自增自减去运算多次,一个代码长,一个看去费劲,直接用一条指令实现而且更容易看不是很好吗。自增自减适合与与别的语句结合起来,运算次数少的语句中。否则看去就是太乱。

duzunchong 发表于 2017-10-10 11:13:19

丶忘却的年少o 发表于 2017-10-10 10:52
是的,的确不需要看前面的负号,你可以自己定义一个 i = 9,然后先打印下 -i 的值,然后再打印下 i 的值 ...

明白了,感谢您的耐心解答

丶忘却的年少o 发表于 2017-10-10 11:58:11

duzunchong 发表于 2017-10-10 11:13
明白了,感谢您的耐心解答

不用客气,我就是喜欢唠叨,哈哈哈{:10_330:}

duzunchong 发表于 2017-10-10 16:56:58

丶忘却的年少o 发表于 2017-10-10 11:58
不用客气,我就是喜欢唠叨,哈哈哈

大神麻烦您在帮我看下这个
#include <stdio.h>

void main()
{
        int a=2,b=4,c=6,x,y;
        y=(x=a+b),(b+c);
        printf("y=%d,x=%d",y,x);
}
我看视频上说y的值应该是等于最后一个表达式,也就是b+c,应该等于10啊,可我为什么打印出来是6

丶忘却的年少o 发表于 2017-10-10 19:00:57

y=((x=a+b),(b+c));
改成这样,编程的时候必须要知道优先级的问题,=的优先级大于 , 的优先级,记住,的优先级最小,要想先执行逗号运算符就要加()

duzunchong 发表于 2017-10-11 16:12:36

丶忘却的年少o 发表于 2017-10-10 19:00
y=((x=a+b),(b+c));
改成这样,编程的时候必须要知道优先级的问题,=的优先级大于 , 的优先级,记住,的优 ...

好的,解释一下瞬间就明白了,谢谢

sunnyday 发表于 2017-10-29 15:56:39

duzunchong 发表于 2017-10-10 10:16
谢谢!

不用
页: [1]
查看完整版本: 刚学C语言,遇到个不懂的地方,请大神指点