为什么这个代码,以下程序代码的输出结果是不对

858 条评论分享收藏感谢收起int a = 10;
int b = 10;
int c = a + //C
A是sequenced before B,B是sequenced before C。没有什么歧义,不难理解。其实标准中明确说了:Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.简单点说,就是每个分号前的语句(full-expression,不算for loop那种的分号),一定sequenced before 分号后的语句。那么什么情况下,A不sequenced before B,同时B也不sequenced before A,怎么可能呢。其实也不难理解,就是A可能在B之前执行,B也可能在A之前执行,甚至A和B可以交叉执行。下面的例子,int a = 10;
int b = 5;
int c = (a+b) * (a-b);
前面那个(a+b)是A,后面那个(a-b)是B,这是典型的unsequenced例子。为何?为了优化。稍微学学编译器优化就了解了,执行顺序不同,效率完全不一样,特别是有流水线的情况下。还有内存优化,cache等问题。C为了效率,就特意规定了这是个unsqeuenced的情况,编译器可以根据cpu,根据上下文随意优化。注意,unsequenced本身不是错误!就如上面那个例子是正确的写法。因为即使是unsequenced,上面的例子无论怎样优化,结果都是一样的。关于unsequenced,标准说:Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.大概就是说,绝大多数(except where noted) 运算符/操作符(加号减号乘号等等)的2个或者2个以上的运算子/操作子之间是unsequenced。表达式的2个或者多个子表达式之间也是unsequenced。例如int a = 10;
int b = 5;
int add(int i, int j) { return i+j; }
add(a + b, a - b);
以上的a+b和a-b分别是add(a + b, a - b)这个表达式的子表达式,所以也是unsequenced。最后的最后:If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, and they are not potentially concurrent, the behavior is undefined.就是说,如果2个unsequenced的操作,同时改变了同一个object的值(side effect),那么结果就是undefined behavior。所以楼主的y=w++*w++*w++;
z=--x*--x*--x;
都是非常典型的undefined behavior。还有人问std::cout && i++ && i++ && std::
很明显是一个表达式的子表达式,unsequenced,所以undefined behavior赞同 343 条评论分享收藏感谢收起文件输入输出:为什么我打的代码和书上运行结果不一样?
[问题点数:40分,结帖人Bzy_NET]
本版专家分:121
结帖率 99.02%
CSDN今日推荐
本版专家分:2393
本版专家分:121
本版专家分:323
本版专家分:2393
本版专家分:369380
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:121
本版专家分:2393
匿名用户不能发表回复!|
其他相关推荐编程是一门有趣的科学,我喜欢。
为什么 y&0 时,输出结果不对?
#include&stdio.h&
double mhs(double x,int y)
return x * mhs(x,y-1);
return 1.0/x*mhs(x,(-y)-1);
void main()
int x,y;/*定义三个变量*/
printf("enter two number(x,y):");
scanf("%d%d",&x,&y); /*输入xy的值*/
f=mhs(x,y);
/*调用自定义mhs函数*/
printf("%f\n",f);
}为什么 y&0 时,输出结果不对?
没有更多推荐了,新手求教,这段代码哪里错了?为什么输出结果为-?【c新手吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:8,804贴子:
新手求教,这段代码哪里错了?为什么输出结果为-?
用vc++6.0编写一个简单的财务应用程序来计算职工所得的实际工资实验1:.总工资=基本工资+奖金。 高级职员:底薪2000元,奖金系数1.15一般职员:
办事员: 利润&50万元,奖金提成%1; 50万&=利润&80万,高出50万部分奖金提成1.2%80万&=利润&100万,高出80万部分奖金提成1.3% 利润&100万,高出100万部分奖金提成1.5%实验2:.按国家要求扣税。实验3:.按国家要求扣养老金(占基本底薪8%)医疗保险(占基本底薪6%)失业保险(占基本底薪5%)#include&stdio.h&main(){float w1,w2,w3,p,t,ep,mi,printf(&请输入职工类别(高级职员输1,一般职员输2,办事员输3):\n&);scanf(&%d&,&num);if(num==1){ep=; mi=; ui=;
if(p&0&&p&=500000){w1=2000+p*1.15*0.01;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&500000&&p&=800000){w1=*0.1+(p-.15*0.012;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&800000&&p&=1000000){w1=*0.01+.012+(p-.15*0.013;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&1000000){w1=*0.01+.012+.013+(p-.15*0.015;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }}if(num==2){ep=; mi=; ui=;
if(p&0&&p&=500000){w1=1500+p*1.10*0.01;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&500000&&p&=800000){w1=*0.1+(p-.10*0.012;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&800000&&p&=1000000){w1=*0.01+.012+(p-.10*0.013;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&1000000){w1=*0.01+.012+.013+(p-.10*0.015;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }}if(num==3){ep=; mi=; ui=;
if(p&0&&p&=500000){w1=1000+p*1.0*0.01;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&500000&&p&=800000){w1=*0.1+(p-.0*0.012;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&800000&&p&=1000000){w1=*0.01+.012+(p-.0*0.013;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }
if(p&1000000){w1=*0.01+.012+.013+(p-.0*0.015;w2=w1-ep-mi-
if(w2-3500&=0){t=0;w3=w2-t;}else if(w2-){t=(w2-;w3=w2-t;}else if(w2-){t=+(w2-;w3=w2-t;}else if(w2-){t=++(w2-;w3=w2-t;}else if(w2-){t=+++(w2-1;w3=w2-t;}else if(w2-){t=++++(w2-3;w3=w2-t;}else if(w2-){t=+++++(w2-5;w3=w2-t;}else{t=++++++(w2-8;w3=w2-t;} }}printf(&总工资=%.2f,实际工资=%.2f,扣税=%.2f,养老金=%.2f,医疗保险=%.2f,失业保险=%.2f\n&,w1,w3,t,ep,mi,ui);}
看输出情况可能是没有初赋值,或者结果超上限.稍微看了下,你的P没初赋值吧..建议你把变量的名字用拼音或者英文.. 或者注释一下.. 要不然不容易看懂..
太牛了,这么长
...好长。。
楼主,想知道你是哪里错了
楼主,有改后正确的解题答案步骤吗发来看一下同刚学c++
贴吧热议榜
使用签名档&&
保存至快速回贴

我要回帖

更多关于 下面代码的输出结果是 的文章

 

随机推荐