鱼C论坛

 找回密码
 立即注册
查看: 8258|回复: 30

看课程学完第一课。两个问题 望大家一起讨论

[复制链接]
发表于 2014-3-17 22:23:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void main()
{
    int a = 2, b = 4, c = 6, x, y;
y = (x = a + b),(b + c);
printf("y=%d,x=%d\n",y,x);
}
小甲鱼说逗号运算符都是第二组运算结果赋值给Y 可是第二组不是 4+6 =10
但是结果是 6? QQ图片20140317221655.jpg


void main()
{
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d\n", p, q, i, j);
}
第二个更有意思了 按正常人理解应该是 6+7+8 但是其结果却是22
据说是编译器不同造成的结果
按说 j 自增1的情况第一个 数值应该6  但是他等于自增完了又自增了一次
到底.jpg





QQ图片20140317221655.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-17 22:29:04 | 显示全部楼层
自己先顶一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-18 00:10:17 | 显示全部楼层
此为第一个表达式 y = (x = a + b), 此为第二个表达式(b + c) 取最后一个表达式的结果,但是。你输出的是Y,你懂? y = (x = a + b),
对于++-- 放后先赋值后自增自减 p = (i++) 这是,内存里存放6+ (i++)这是5 内存中存放7 + (i++)还TM是5内存中存放8;
第二个q我也不明白,不过应该是运算符的结合性问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-18 08:54:35 | 显示全部楼层
这个好,让我对c的++--又进一步了解了!有问题分享出来就是好啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-18 10:10:46 | 显示全部楼层
第一个问题:y = (x = a + b),(b + c);是一个逗号表达式,楼主并没有

将这个表达式的值赋给一个变量并进行输出。楼主可尝试一下代码:
#include<stdio.h>
void main()
{
    int a = 2, b = 4, c = 6, x, y,z;
        z = (y = (x = a + b),(b + c));
        printf("y=%d,x=%d,z=%d\n",y,x,z);
}
第二个问题:我分别运tc2.0和vc6.0计算了一下q = ++j + ++j + ++j;
和q = (++j) + (++j) + (++j);的值。tc2.0的结果前一个会出现错误后一

个是24,vc6.0的结果都是22。
vc的结果我想应该是这样得来的:+和++是同级运算符,结合性是自右向左

。计算时先算(++j)+(++j)的值因为结合性是自右向左,而且前++先计

算。因此先算右面的++j是6,然后算左面的(++j)的值是7,所以(++j)+

(++j)的值为7+7;接下来计算最后一个(++j)的值是8,最后q=7+7+8=22

。(++j加不加括号应该vc应该都是一样处理的)
tc的结果应该是先计算三个(++j)的值然后再相加得到24。

以上是我个人的一些想法,有错误请大家帮忙纠正!谢谢!
希望对楼主有帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-18 21:23:42 | 显示全部楼层

后边的课程给了 解释 而且 如果都作为 J++ J++ 反倒不自增 应该是 + 和 ++是未定义优先级的原因·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-18 21:28:34 | 显示全部楼层
九州的弃族 发表于 2014-3-18 10:10
第一个问题:y = (x = a + b),(b + c);是一个逗号表达式,楼主并没有

将这个表达式的值赋给一个变量并进 ...

看来是计算机的思维跟咱不一样  我分别试了 j++ j-- --j ++j -(++j) -(j++)还有符号的 得出的结果很有意思
非常感谢··你提供的 多交流{:7_169:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-18 21:36:03 | 显示全部楼层
继续提出问题
#include <math.h>
#include <stdio.h>
void main()
{
    double a,b,c,s,area;
        scanf("%lf,%lf,%lf",&a,&b,&c);
        s = (a+b+c) / 2.0;
        area = sqrt(s*(s-a)*(s-b)*(s-c));
        printf("a = %7.2g, b = %7.2g, c = %7.2g, s = %7.2g\n",
                a , b , c , s);
        printf("area = %7.2f\n",area);
}



3.0 4.0 5.0
a =       3, b = -9.3e+061, c = -9.3e+061, s = -9.3e+061
area =    0.00
Press any key to continue

得出的结果 迷茫了 仔细检查了一遍 貌似没有哪里写错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-18 23:49:59 From FishC Mobile | 显示全部楼层
好多的好多的怪算法你啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-19 08:30:46 | 显示全部楼层
这个应该是scanf输入格式的问题,按照楼主3.0 4.0 5.0这样输入,我也得出了同楼主相同的结论;楼主请尝试3.0,4.0,5.0这样输入,这是因为输入格式要与scanf中“%lf,%lf,%lf”的格式相同。这个以前我也经常犯错,为避免可以输出一句话提醒,如下:
#include <math.h>
#include <stdio.h>
void main()
{
                double a,b,c,s,area;
                printf("请输入三角形的三个边长:a,b,c\n");
        scanf("%lf,%lf,%lf",&a,&b,&c);
        s = (a+b+c) / 2.0;
        area = sqrt(s*(s-a)*(s-b)*(s-c));
        printf("a = %7.2g, b = %7.2g, c = %7.2g, s = %7.2g\n",
                a , b , c , s);
        printf("area = %7.2f\n",area);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 11:37:21 | 显示全部楼层
pspbbs 发表于 2014-3-18 23:49
好多的好多的怪算法你啊

跟课程一块来的·····并不奇怪啊···{:2_27:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 11:38:33 | 显示全部楼层
九州的弃族 发表于 2014-3-19 08:30
这个应该是scanf输入格式的问题,按照楼主3.0 4.0 5.0这样输入,我也得出了同楼主相同的结论;楼主请尝试3. ...

啊哈  对了,感谢九州··· 看来小c有时候也很少让人恼怒嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-19 12:51:10 | 显示全部楼层
()中的部分有逗号才取逗号后的部分赋值,而在(X=a+b),(b+c)之外没有括号,所以y取的是(x=a+b)的值  若将其改为如下则成功:
#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\n",y,x);
}

输出y=10,x=6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 14:12:27 | 显示全部楼层
R-S 发表于 2014-3-19 12:51
()中的部分有逗号才取逗号后的部分赋值,而在(X=a+b),(b+c)之外没有括号,所以y取的是(x=a+b)的值 ...

:handshake 也就是说 一般,逗号这样的 都带有()呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 14:15:22 | 显示全部楼层
本帖最后由 被遗忘的指环 于 2014-3-19 14:38 编辑

void main()
{
    char c = 'k';
        int i = 1,j = 2,k = 3;
        float x = 3e+5,y = 0.85;
        printf("%d,%d\n",!x*!y,!!!x);   //0 0
        printf("%d,%d\n",x||i&&j-3,i<j&&x<y); //1 0
        printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);//0 1
}
贴出个容易错的地方 其中float x = 3e+5 如果写成 3e + 5(这其实是为了美观,然后发生错误,expected exponent value, not ' ' 就是 3e + 5不是浮点型),招了一会儿发现要这么写。哈哈 容易犯错 ,谨记!


void main()
{
    int  a, b, max;
printf("\n input two numbers:");
    scanf("%d%d", &a, &b);
max = a;
if(max < b)
{
  max = b;
}
printf("max = %d,max");
}

很诡异的··

input two numbers:32 23
max = 0,


为何max 为0? 改成 a<b 也不行 诡异.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 14:36:48 | 显示全部楼层
如何取值都等于0···········
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-19 18:32:56 | 显示全部楼层
被遗忘的指环 发表于 2014-3-19 14:12
也就是说 一般,逗号这样的 都带有()呗

可以这么说 , 逗号外没括号 取值是逗号前的:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 20:02:23 | 显示全部楼层
R-S 发表于 2014-3-19 18:32
可以这么说 , 逗号外没括号 取值是逗号前的

:handshake thanks a lot!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-19 20:08:07 | 显示全部楼层
#include <stdio.h>
void main()
{
double f = 0, p = 0, w = 0, d = 0;
int s = 0;
printf("请输入 “基础运费”,“货物重量”,“距离”。总运费马上出来!\n");
    scanf("%lf%lf%lf, &p, &w, &s");
if(s<250)
{
        d = 1;
}
if(250<= s < 500)
{
  d = 0.98;
}
if(500 <= s < 1000)
{
  d = 0.95;
}
if(1000 <= s < 2000)
{
  d = 0.92;
}
if(2000 <= s < 3000)
{
  d = 0.9;
}
if(3000 <= s)
{
  d = 0.85;   // 运费总价f = p * w * s * (1 - d)
}
f = p * w * s * (1 - d);
printf("运费总价是 %15.2lf\n",f);
}

编译通过.jpg 不出结果.jpg 就是不出结果····是不是我机器问题,哪位帮试验一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-19 20:30:40 | 显示全部楼层
被遗忘的指环 发表于 2014-3-19 20:08
#include
void main()
{

你看你scanf第三个参数应该是%d,你写成%lf了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表