看课程学完第一课。两个问题 望大家一起讨论
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?
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但是他等于自增完了又自增了一次
自己先顶一下吧 此为第一个表达式 y = (x = a + b), 此为第二个表达式(b + c) 取最后一个表达式的结果,但是。你输出的是Y,你懂? y = (x = a + b),
对于++-- 放后先赋值后自增自减 p = (i++) 这是,内存里存放6+ (i++)这是5 内存中存放7 + (i++)还TM是5内存中存放8;
第二个q我也不明白,不过应该是运算符的结合性问题 这个好,让我对c的++--又进一步了解了!有问题分享出来就是好啊 第一个问题: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。
以上是我个人的一些想法,有错误请大家帮忙纠正!谢谢!
希望对楼主有帮助! hhb14056 发表于 2014-3-18 00:10 static/image/common/back.gif
此为第一个表达式 y = (x = a + b), 此为第二个表达式(b + c) 取最后一个表达式的结果,但是。你输出的是Y, ...
后边的课程给了 解释 而且 如果都作为 J++ J++ 反倒不自增 应该是 + 和 ++是未定义优先级的原因· 九州的弃族 发表于 2014-3-18 10:10 static/image/common/back.gif
第一个问题:y = (x = a + b),(b + c);是一个逗号表达式,楼主并没有
将这个表达式的值赋给一个变量并进 ...
看来是计算机的思维跟咱不一样我分别试了 j++ j-- --j ++j -(++j) -(j++)还有符号的 得出的结果很有意思
非常感谢··你提供的 多交流{:7_169:} 继续提出问题
#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
得出的结果 迷茫了 仔细检查了一遍 貌似没有哪里写错 好多的好多的怪算法你啊 这个应该是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);
} pspbbs 发表于 2014-3-18 23:49 static/image/common/back.gif
好多的好多的怪算法你啊
跟课程一块来的·····并不奇怪啊···{:2_27:} 九州的弃族 发表于 2014-3-19 08:30 static/image/common/back.gif
这个应该是scanf输入格式的问题,按照楼主3.0 4.0 5.0这样输入,我也得出了同楼主相同的结论;楼主请尝试3. ...
啊哈对了,感谢九州··· 看来小c有时候也很少让人恼怒嘛 ()中的部分有逗号才取逗号后的部分赋值,而在(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 R-S 发表于 2014-3-19 12:51 static/image/common/back.gif
()中的部分有逗号才取逗号后的部分赋值,而在(X=a+b),(b+c)之外没有括号,所以y取的是(x=a+b)的值 ...
:handshake 也就是说 一般,逗号这样的 都带有()呗 本帖最后由 被遗忘的指环 于 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()
{
inta, 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 也不行
如何取值都等于0··········· 被遗忘的指环 发表于 2014-3-19 14:12 static/image/common/back.gif
也就是说 一般,逗号这样的 都带有()呗
可以这么说 , 逗号外没括号 取值是逗号前的:handshake R-S 发表于 2014-3-19 18:32 static/image/common/back.gif
可以这么说 , 逗号外没括号 取值是逗号前的
:handshake thanks a lot! #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);
}
就是不出结果····是不是我机器问题,哪位帮试验一下
被遗忘的指环 发表于 2014-3-19 20:08 static/image/common/back.gif
#include
void main()
{
你看你scanf第三个参数应该是%d,你写成%lf了。。。。
页:
[1]
2