关于c++编译问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 02:03:40
我用的是vc++2005
第一个问题:
#include<iostream>
using namespace std;
int main()
{
int a=7;
float x=2.5,y=4.7;
cout<<x+(float)(a%3*(int)(x+y)%2)/4<<endl;
return 0;
}
这样的结果是2.75.但是如果x+a%3*(int)(x+y)%2/4就是把float强制转换去掉得到的结果就是2.5.其实a%3*(int)(x+y)%2计算结果为1但是当执行a%3*(int)(x+y)%2/4得到的是零.1除以4不是应该得0.25吗?是不是由于1是int型。编译器在处理1除以4的时候就把结果也取整。所以为零。我是这样理解的。呵呵呵。
第二个问题:
#include <iostream>
using namespace std;
int main()
{
char c1='a',c2='b',c3='c',c4='\102',c5='\115';
cout<<c1<<c2<<c3<<'\n';
cout<<"\t\b"<<c4<<'\t'<<c5<<'\n';
return 0;
}
就是不明白为什么c4和c5输出对应的结果是大写的B和M。102和115对应的ASCII不是f和s吗?实在是不明白?呵呵。

1 这个涉及编译器的隐式转换
编译器把表达式类型转换为最大的变量类型
加上FLOAT后全部以FLOAT运算,得到的结果包括中间结果也是FLOAT
没有FLOAT则以INT运算,得到的结果包括中间结果也都是INT

2
\102 代表8进制 = 十进制的66,就是B
\115 同理

1、在c++里int / int的结果就是int,所以1/4=0.你的理解是对的
2、我也不知道

1、如果不加强制转换成float,当两个整型数相除时得到的答案也是整型,所以系统自动将答案的小数点后的数舍去,0.25就成了0,你的理解是对的。
2、‘\102’表示的是以八进制数102为ASCII码的字符,八进制102转换成十进制就是66,即字符B的ASCII码,‘\115’的算法也一样。所以是B和M。