水平有限,有明白的和不明白的...
先说明白的:
74724183943651LL;//两个LL是什么意思?
比如,有时候我们会希望用long类型来储存一个较小的整数,如果希望把一个较小的常量作为long对待,可以使用 L 作为后缀。这样在int类型为16位,long类型为32位的系统中,会把整数,比如说7作为16位数储存,而整数7L作为32位数储存。同理,在支持long long类型的系统中,可以使用LL后缀标识long long类型值。
但是问题是 程序已经定义了 i 为 long long类型啊,为什么还需要在数字最后加上LL呢?
试着把LL去掉,我的编译器是C-FREE5.0,运行出错:integer costant is too large for “long” type.
我的理解是,编译器不能识别long long类型,依然在把常量74724183943651当做long类型。而long类型,即使是无符号的也只到4294967295。
long long类型是64位整数,我的电脑是32位处理器,但常规的32位整数只能够处理40亿以下的数。
但是在后面加上LL又可以运行了,运行结果与楼主的一模一样。不明白。
————————————————————————————————————————————————————————————————————分割线
接下来解释程序的执行。
先解释为什么x的值为156.34
switch():括号里可以是整形,字符型等表达式,所以可以为j,j一开始被赋值为1了。但是case C和P,R被预处理器定义为了14,10和6。switch()是执行值的相等性的检查,如果相等,则执行。所以当j等于1,并自增为2,3,4,5时,switch里的case都不会被执行。又
if ( j < 6 )
x = 10.0 * x + (double) d;
所以j为1或2,3,4,5,时,循环执行关于x的算术式。
第一次,d=i%10;(对i取模)所以d的值为1。if else语句之后,有另一个计算式i/=10,等价于i=i/10。所以
74724183943651/10 = 7472418394365.1(之后.1会被舍掉。即最后等于7472418394365)
第二次,d=i%10,就应该为 7472418394365 % 10,余数为5。
以此类推,可以得到
————————————————————————————————————————————————————————————————————分割线
第一次 d = 1
第二次 d = 5
第三次 d = 6
第四次 d = 3
第五次 d = 4
(接下来的次数d的值为k为什么会输出9281和4274铺垫一下)
第六次 d = 9
第七次 d = 3
第八次 d = 8
第九次 d = 1
第十次 d = 4
第十一次 d = 2
第十二次 d = 7
第十三次 d = 4
————————————————————————————————————————————————————————————————————分割线
x = 10.0 * x + (double)d;
一开始x被赋值为0.0了,所以第一次x = 10.0 * 0.0 + 1 = 1.0
第二次 x = 10.0 * 1.0 + 5 (第二次d为5) = 15.0
以此算下去,第五次时,x = 15634。 输出表达式是x/100,所以输出值为 156.34。
————————————————————————————————————————————————————————————————————分割线
第6次,当switch(j)等于j=6时,case R 也为6,所以程序会先执行 case R:那就是 k = 0; 然后计算 k = 10 * k + d; k = 10 * 0 + 9 = 9; 第6次d = 9(见上)
第7次,k = 10 * 9 + 3 = 93;
第8次,k = 93 * 10 + 8 = 938;
第9次,k = 938 * 10 + 1 = 9381;
直到第10次,j的值等于 case P了,这时k为9381,所以输出,The product number is 9381。
然后执行,k = 0;
那么执行 k = 10 * k + d 即是 k = 10 * 0 + 4 = 4;第10次 d = 4(见上)
第11次,k = 10 * 4 + 2 = 42;
第12次,k = 10 * 42 + 7 = 427;
第13次,k = 10 * 427 + 4 = 4274;
最后到第14次,j的值等于case C了,这时k为4274,所以输出 The company name is 4274。
————————————————————————————————————————————————————————————————————分割线
本人新手,这些是在读这段代码时自己抄下来敲出来然后在纸上做出的分析,有不得当的,欢迎指正。
[
本帖最后由 小鸦 于 2013-4-11 10:23 编辑 ]