/*
*
*这里主要说明C和C++类型增强的程序
*
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
/***C语言 const int a; 不赋初始值
* 如果你这样定义,只是你后面不能给他赋值,不代表编译不过去,
* 但是C++不行,C++编译都通不过去
* 还有一个问题就是你C语言可以通过取它的地址来改变这个值,但是C++不行
* 原因:你定义一个int *p=&a;这里其实是强制类型转换了一波
* 相当于int *p=& const int , const int *p,强行将const int *转换为 int *
*C里面只会报警告,能编译过去,而且还能改变这个值
*但是C++是编译都编译不过去
*而且还有malloc malloc你不强制类型转换打话,是个void *,C++也是不能编译过去,需要在前面强制类型转换类型。其实说白了就是C++不喜欢隐式强制类型转 *换
*/
/*
#ifdef i
const int a=100;
int *p=(int *)&a;
*p=100;
printf("a = %d \n",a);
return 0;
#endif
int *q=(int *)malloc(100);
return 0;
*/
/*
*增加了一个bool类型
*C语言中的逻辑真假用0和非0表示,而C++中有了具体的类型
*/
bool flag= true;
if(flag)
{
printf("true\n");
}
return 0;
}
/*
*
* 用来说明枚举的不同
*
*/
/*
*1,C++里面对变量的声明是不同的
*比如下面的struct student,在C++中可以用 student来定义一个struct student类型
*的变量,但是在C语言里面不行,enum类型一样的。
*而且这里注意的是,这里只能选枚举里面的内容,你赋值0 100什么都会报错
*但是C不会,C还会输出出去。
*而且枚举还有一个不好的地方
*你enum{Mon,Tue,Wed,Thu,Fri,Sat,Sun};
*这里相当于#define Mon 0
*在C里面表达式是不能做为左值的,但是在C++里面是可以的,
*比如int a,b=10;
*(a=b)=100是可以的,C++里面这里就等于先把b的值赋值给a,然后在把100赋值给a
*但是C里面会报错,这其实是一个运算符重载的问题
*/
#include<iostream>
enum Day{
Mon,Tue,Wed,Thu,Fri,Sat,Sun
};
struct student{
char name[9];
int num;
};
int main()
{
student stu;
int a,b=10;
(a=b)=100;
Day da;
// da=0;
da=Tue;
printf("da= %d\n",da);
printf("a = %d b=%d\n",a,b);
//printf("helloworld\n");
return 0;
}
/*
*
*C++中的输入和输出
*cin 和cout其实就是类对象
* 跟scanf和printf其实是一样的功能,只是一个是函数,一个是对象
*/
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
//char name[30];
/*
*
*这里cin>>a>>b;就相当于cin>>a,cin>>b;
*这里的cout同理
*这里的endl就等于end line相当于C语言的\n
*C语言中的printf拥有强大的格式化控制,C++亦可以实现
*但是略复杂
*/
//cin>>a>>b;
//cout<<a<<endl<<b<<endl;
//cin>>name; //>>这个流输入运算符
//cout<<name<<endl;
/*
*在C语言中,假设你定义一个a=12345,然后再来一个float b=1234.567;
*%8d这个时候会出现一个什么样现象,占8个字符,然后左边空三个
*你就可以用printf("%8d\n",a);
*如果是prinf("%-8d--",a); 占8个字符,但是-8表示像左对齐,所以输出的话是
*12345 --,后面会空3个空格
*这里%.2f表示输出小数点后两位,printf("%.2f\n",b)的时候 这里四舍五入,输出的结果是1234.57,默认是输出6位小数。
*/
int a=12345;
float b=1234.567;
//printf("%-8d---\n",a);
//printf("")
//printf("%f\n",b);
/*
*如果我们用C++里面的cout怎么输出
*cout<<a<<endln就行了
*注意这里如果加了引号和双引号
*那就会输出字符a
*那我现在要实现一个东西,我要让你怎么办呢,我要让你输出一个宽度的问题
*setw就是设置输出宽度,默认为右对齐,跟上面不一样,如果你想要左对齐的话就-8是不可以的,如果是-8就是放了一个很大的数字,正确的话应该是setiosflags(ios::left),输出cout<<setiosflags(ios::left);
*还要加头文件#include<iomanip>
*C++中的头文件有个特点,没有.h这个概念,
*/
//cout<<setiosflags(ios::left)<<setw(-8)<<b<<endl;
//然后我们输出float型的数据,假设我们直接调用
//cout<<b<<endl;
//这里输出1234.57,这里是6个有效数字,默认6个有效数字
//setprecision(2)可以设置有效位数,setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的数字
//cout<<setw(10)<<setprecision(5)<<setiosflags(ios::fixed)<<b<<endl;
//C里面printf("%x\n",a);但是C++里面要输出的话就用cout<<hex<<a<<endl;
//cout<<hex<<a<<endl;
//
//如果你左对齐和右对齐的时候如果位数不够的话C中不能填充特定的字符
//但是C++可以
cout<<setfill('x')<<setw(10)<<a<<endl;
return 0;
}