有以下程序: main() { int i=10, j=65; printf("%d,%c\n",(--i,j++),(i++,++j)); } 执行后输出结果是????

如题所述

第1个回答  2011-07-20
1、结果为:66,B
2、逗号表达式带括号时,最后的一个表达时的值会压栈(j++)
括号表达式在j++的外部,导致j++运算后j的值被压栈。
++j与此类似,但更没有疑问。
3、对应反汇编如下:
00401BE6 mov eax,dword ptr [ebp-4]
00401BE9 add eax,1
00401BEC mov dword ptr [ebp-4],eax
00401BEF mov ecx,dword ptr [ebp-4]
00401BF2 sub ecx,1
00401BF5 mov dword ptr [ebp-4],ecx
00401BF8 mov edx,dword ptr [ebp-8]
00401BFB add edx,1
00401BFE mov dword ptr [ebp-8],edx
00401C01 mov eax,dword ptr [ebp-8]
00401C04 push eax
00401C05 mov ecx,dword ptr [ebp-8]
00401C08 mov dword ptr [ebp-30h],ecx
00401C0B mov edx,dword ptr [ebp-30h]
00401C0E push edx
00401C0F push offset string "%d,%c\n" (00472068)
00401C14 mov eax,dword ptr [ebp-8]
00401C17 add eax,1
00401C1A mov dword ptr [ebp-8],eax
00401C1D call printf (00408410)
00401C22 add esp,0Ch
可以看到:A、入栈的都是j,在调用printf之前进行了一次加一的动作。
B、printf之后又进行了一次加一的动作,最后j的实际值是67。
C、%d,%c两个占位符其实对应的是同一个寄存器中的值。
4、经常我们会对一些不常用的语法不知所措。这时候如果我们经常去问别人,可能不能马上获得满意的答案。此时,抱着“存在即是有理”的精神,我们看看这个编译器究竟是怎么做的(反汇编),就容易深入的理解问题了。
并且我们还要有个警示:不同的编译器的编译解释是不相同的。我们只需要知道它是这样做就可以了,但它究竟为什么要这样做,那就需要我们以后慢慢体会了。
第2个回答  2011-07-20
对于输出语句中的赋值表达式(包含自加自减),其执行方式是从右向左;还有注意自加自减在变量的左和右时的不同运算规则。
所以先执行右边的"(i++,++j)”这个逗号表达式,取括号中后一个表达式++j的值(j自加后的值66)以字符形式输出,即对应ASCⅡ的字符'B';此时i值经自加变为11;
然后执行前一表达式"(--i,j++)”,同样取括号中后一个表达式j++的值(此时为66)以整型数据输出。
最后输出结果为66,B
最后的i 值变为10,j 值变为67。(但这个不要求输出)
一楼结果是对了,但是原因还是没有说对,看上去还没把自加自减的运算规则弄清楚。
三楼说的我看不懂,但相信三楼一定是学得更深入了,是大师吧。不过对初学者来说还是讲得浅显点好。
第3个回答  2011-07-20
66, B
逗号运算符的值为最后一部分的值
所以
printf("%d,%c\n",(--i,j++),(i++,++j));
相当于
printf("%d,%c\n",j++,++j);
从左到右计算
先计算j++,j=65+1=66
所以第一个输出为66
++j表示先输出后++
所以j在输出时仍为66,按字符输出,ascii码为66的字符是B
所以输出66,B本回答被网友采纳
第4个回答  2011-07-21
10,2

--写后面 先取了i的值再对i+1
同理++写前面,先+1再取j的值

显示的是10,2

最后i的值是9,j的值是2
第5个回答  2011-07-20
结果是:66 C
但是原因的话 还没有分析清楚

有以下程序 main(){ int i=10,j=1; printf("%d,%d\\n",i--,++j); }...
最后i的值是9,j的值是2

...main() { int i=010 , j = 10; printf("%d,%d\\n",+ +i , j...
输出结果是:9 10 原因是:010是8进制,换算成十进制就是8,也就是i的值为8,++i后,i的值为9,所以输出9。j--会先输出j的值,然后在做--操作,所以输出10.

...main() { int i=010 , j = 10; printf("%d,%d\\n",+ +i , j...
010是指八进制的10,也就是十进制的8 所以自增运算,自减运算的前后缀的问题不用我说了吧 第二个1,0

main() { int i=10,j=1; printf("%d,%d\\n",i-- ,++j); }执行后输出结果...
10,2 i--是先使用后自减,++j是先自加后使用。满意请给最佳

...main() { int i=010,j=10; printf("%d,%d\\n",++i,j--);
结果 9,10 0开头表示八进制 i=010 转换成十进制是 8 ++i是先让i的值加1也就是9,然后再返回也就是10 j--是先返回j的值10,然后再减1也就是9.选B

...main( ) { int i=010,j=10; printf("%d,%d\\n",i++,j--); }_百度...
解释一下:变量i初始化为010,最高位的0表示它是八进制数,而八进制的10就对应10进制的8,变量j就是10进制的10.对于++,--自增自减运算,如果变量在前就先用变量,再自增或自减,如果++ --在前则先自增或自减再用.所以题中输出的就应该是i,j自增自减前的原值8和10 比如我设z=i++;那么这...

...main() { int i,j; i=10; printf("%d,%d,%d\\n",i--,j=i++,j=++...
逗号分隔,从右向左计算,顺序如下 j=++i;i先加1,i=11;j=11;j=i++;i先赋值11;j=11;i--;i先赋值11;i++与i--在语句结束后改变。

...main() { int i=010,j=10; printf("%d,%d\\n",i++,j--); }_百度知...
关键是这个 int i=010 最高位的0表示这个数是以八进制来表示的,你看,八进制的10,不就是10进制的8么。就这么简单 可以参考一下int i=0x10,这个就是十六进制的,换成十进制就是 16

main() { int i=10,j=1; printf("%d,%d\\n",i--,++j);}结果是多少
前置自加自减 是先自加\/自减, 再取值.后置自加自减 是先取值,再自加\/自减.所以这里的i--, 先取值, 值为10.++j, 先自加j=2, 再取值.于是输出是10,2

...main() { int i=010,j=10; printf("%d,%d\\n",++i,j--); }_百度知...
i是9吧!不是10

相似回答