| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1175 人关注过本帖
标题:这个程序输出什么?实在看不明白。
只看楼主 加入收藏
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
结帖率:71.88%
收藏
 问题点数:0 回复次数:12 
这个程序输出什么?实在看不明白。
#include<stdio.h>
 #define C 14
 #define P 10
 #define R 6

 main ( ) {
     long long i = 74724183943651LL;//两个LL是什么意思?
     int d, j = 1, k = 9;
     double x = 0.0;

     while ( i > 0 ) {
         d = i % 10;//d=1吗?
         switch ( j ) //j=1, 为什么case后面是字母呢?
  {
         case C:
             printf("The company name is %d\n", k);
             break;
         case P:
             printf("The product number is %d\n", k);
             k = 0;
             break;
         case R:
             k = 0;
         }
         if ( j < 6 )
             x = 10.0 * x + (double) d;
         else
             k = 10 * k + d;
         i /= 10;
         j++;
    }
    printf("The price is $%.2lf\n", x / 100 );

}
搜索更多相关主题的帖子: company include product 
2013-04-10 23:39
雅布珊
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2013-4-10
收藏
得分:0 
你确定这个程序能运行吗?我运行了。。。不行。首先:long long i = 74724183943651LL,是非法的。字母C/P/R,是定义的三个特殊值。switch ( j )j=1,指为真。水平有限,无法具体解释。一起探讨学习吧!
2013-04-11 00:14
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
可以运行,结果是:
The product number is 9381
The company name is 4274
The price is $156.34
就是看不懂为啥。
2013-04-11 04:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
long long i = 74724183943651LL;//两个LL是什么意思?
------ 立即数的后缀
整型的有:
    u 表示 unsigned int
    l 表示 long
    ll 表示 long long
    ul 表示 unsigned long
    ull 表示 unsigned long long
浮点类型的有:
    f 表示 float
    L 表示 long double
2013-04-11 08:46
C入一口气
Rank: 2
等 级:论坛游民
帖 子:14
专家分:22
注 册:2013-4-10
收藏
得分:0 
不懂
2013-04-11 09:28
小鸦
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2013-3-29
收藏
得分:0 
水平有限,有明白的和不明白的...

先说明白的:

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 编辑 ]


一 步 一 印 一 狗 屎 ...

一 嗔 一 痴 一 个 人 ...



2013-04-11 10:11
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
楼上的兄弟,你已经让俺佩服得五体投地了。
2013-04-11 10:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 6楼 小鸦
试着把LL去掉,我的编译器是C-FREE5.0,运行出错:integer costant is too large for “long” type.
------ 没听说过C-FREE5.0这种编译器,google了一下,原来是个IDE。
代码能不能编译器通过,只和编译器相关,和使用的哪个IDE、哪个编辑器等等无关。
按照C/C++标准,74724183943651 应当被升为long long类型,建议你换个符合标准的编译器。
2013-04-11 11:15
小鸦
Rank: 2
等 级:论坛游民
帖 子:8
专家分:24
注 册:2013-3-29
收藏
得分:0 
回复 7楼 winglesswu

不懂的是

已经定义了i为long long类型为什么还要在数字后面加LL呢?

(附:刚谷歌了下IDE与编译器的区别,以前都没查过,受教了。)

顺便求介绍一个编译器。


一 步 一 印 一 狗 屎 ...

一 嗔 一 痴 一 个 人 ...



2013-04-11 11:41
yctchxf
Rank: 6Rank: 6
来 自:盐城
等 级:侠之大者
威 望:2
帖 子:176
专家分:454
注 册:2012-4-10
收藏
得分:0 
以下是引用rjsp在2013-4-11 11:15:26的发言:

试着把LL去掉,我的编译器是C-FREE5.0,运行出错:integer costant is too large for “long” type.
------ 没听说过C-FREE5.0这种编译器,google了一下,原来是个IDE。
代码能不能编译器通过,只和编译器相关,和使用的哪个IDE、哪个编辑器等等无关。
按照C/C++标准,74724183943651 应当被升为long long类型,建议你换个符合标准的编译器。

我的 VC++ 6.0 也出现了类似的错误…… 希望有前辈可以给出较为权威的解答……
2013-04-11 12:50
快速回复:这个程序输出什么?实在看不明白。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019069 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved