const char * 类型的实参与 char * 类型的形参不兼容_【C语言】03-数据类型、运算符与表达式...

数据类型、运算符与表达式

b9041986f2af027b0cfdc910eef6bf90.png

C的数据类型

4bc14a61ebd30e0c07a462f0351c915d.png


注:
数据类型决定:
1. 数据占内存字节数
2. 数据取值范围
3. 可以进行的操作

常量与变量

一、常量和符号常量
1.定义:程序运行过程中,其值不能被改变的量(常数)
2.分类:直接常量、符号常量

969ca2664554981a404b411dc98a0141.png


二、符号常量

用标识符代表常量
1.一般用大写字母:PRICE 、 PI
2.定义格式: #define 符号常量 常量
3.其值在作用域内不能改变和再赋值。
例 符号常量举例
#define PRICE 30
#include <stdio.h>
void main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%dn",total);
}(运行结果:total=300)
注:符号常量的优点是:见名知意、一改全改

变量

一、定义:其值可以改变的量。
二、定义格式:数据类型 变量名;
三、变量应该有名字,并在内存中占据一定的存储单元。
四、变量名和变量值有不同的含义
*变量名实为一个符号地址
例 变量的使用
main()
{
int a;
a=3;
printf(“a=%d",a);
}

dbd9019efd99780f6cd2c56908fbe839.png

标识符

一、定义:标识变量名、符号常量名、函数名、数组名、文件名的
字符串序列——名字。
二、命名规则:
*只能由字母、数字、下划线组成,且第一个字符必须是字母或下划线
*大小写字母含义不同,一般用小写
*不能使用关键字
*TC允许最长32个字符,建议长度不超过8个字符
三、使用:先定义、后使用
注:标识符应该“见名知意”,如 total , max
标识符应该“不宜混淆”,如 l与1 , O与0

整型数据

一、整型常量(整常数)的三种表示方法
*十进制整数:由数字0~9和正负号表示.
如 123,-456,0
*八进制整数:由数字0开头,后跟数字0~7表示.
如 0123,011
*十六进制整数:由0x开头,后跟0~9,a~f,A~F表示.
如 0x123,0xff
补充知识:
一、字节和位
1.内存以字节为单元组成
2.每个字节有一个地址
3.一个字节一般由8个二进制位组成
4.每个二进位的值是0或1

数值的表示方法

原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为1,其余位为原码取反,再对整个数加1

7609bd2324899bea254a9c6b4aea8cd0.png

88a3fe01f94584bc849e994a2c04635d.png

负数补码转换成十进制数:最高位不动,其余位取反加1
例 补码:11111001
取反:10000110
加1: 10000111=-7

整型变量

一、整型数据在内存中的存放形式
*数据在内存中以二进制补码形式存放
*每一个整型变量在内存中占2个字节

135d2915c997ff32488e6872ddabb31d.png

二、整型变量的分类
*三类整型变量

68a2734d1dcf464c7ef3a1c724dc5e5e.png


*整数类型和取值范围

cf3c6758affe0adaaac4dc43d8a2e3be.png


整型变量的定义

先定义后使用——强制类型定义
int a,b; ( 指定变量a、b为整型 )
unsigned short c, d; (指定变量c、d为无符号短整型 )
long e,f; ( 指定变量e、f为长整型)

252b71ef5594df06c02ded1f22ae4ac3.png

11310dc59431407e023ae918bc45ec9d.png


整型数据的溢出

6f6a88b0a54429506f0431e8da69ebe0.png

8909785cd09822564abfc29e07485d07.png

整型常量的类型

一、整型常量的值在-32768~+32767范围内,编译器认为是int类型
二、整型常量的值超过上述范围,而在-2147483648 ~ +2147483647范围内,编译器认为是long类型
三、当系统定义short int与int占内存长度相同,则两种类型常量均可以赋给 int和short int型变量
四、在整型常量后面加大写L或小写l,则告诉编译器,把该整型常量作为long类型处理。例:123L、0L
五、在整型常量后面加u,则按无符号整型方式存放,负数转换成补码再按无符号整型方式存放。

浮点型数据

一、浮点型常量的表示方法
1.浮点数(float)又称为实数(real)
2.两种表示方法:
*十进制小数形式:必须有小数点
如 0.123 、.123 、123.0 、0.0 、123.
*指数形式:e或E之前后必须有数字;指数必须为整数
如 123.456e0、12.3456e1 、1.23456e2 、
0.123456e3 、0.0123456e4 等
二、规范化指数形式 6.28e-2 表示 6.28× 10 -2
*只有一位非零整数的指数形式
*是指数的输出形式-3.0824e4 表示 –3.0824× 10 4

浮点型变量

一、浮点型数据在内存中的存放形式
1.浮点型数据在内存中占4个字节(32位)
2.在内存中分成3部分,指数为2的幂次

2aa247a87d4ef7dd2a96d9b96794f06c.png


二、浮点型变量的分类

c41ce1ca30d3cf97665dc9287e9b122b.png


float x,y; (指定x、y为单精度浮点型变量)
double z; (指定z为双精度浮点型变量)
long double t; (指定t为长双精度浮点型变量)
三、浮点型数据的舍入误差
*数据超过有效位数,则产生误差
*要避免一个很大的数与一个很小的数加减
浮点型数据的舍入误差
#include <stdio.h>
void main( )
{
float a , b;
a= 123456.789e5;
b= a+20;
printf("%f n",b);
}
运行结果:12345678848.000000
注:舍入误差使1.0/3*3 的结果并不等于1 !
四、浮点型常量的类型
*浮点型常量一般按双精度64位处理,数后加F或f按单精度
*浮点型常量不分float和double 字符型数据一、字符常量
*定义:用单引号括起来的单个字符或转义字符
如 ‘a’ ‘A’ ‘n’ ‘t ’
*字符常量的值:该字符的ASCII码值
如 ‘a’——97 ,‘A’——65
‘n’——10, ‘t’——9
*定义格式:char 变量名 = 值
char ch=65 与 char ch=‘A’ 与char=‘101’是等效的
*转义字符:反斜线后面跟一个字符或一个代码值表示转义字符及其含义

3f56c4d0e10900ee1a370809769807dd.png


转义字符的使用
#include <stdio.h>
void main( )
{ printf(“ ab ct derftgn”);
printf(“htibbj k”);
显示结果:
f gde
h j k

字符型数据


一、字符变量
*存放字符常量,占用一个字节,存放一个字符
*定义形式: 赋值:
char c1,c2; c1=‘a’;c2=‘b’;
二、字符数据在内存中的存储形式及其使用方法
*以二进制存放字符的ASCII码值(0~255整数)
*与整数的存储形式类似
**以字符或整数形式输出
向字符变量赋整数
#include <stdio.h>
void main( )
{ char c1,c2 ;
c1=97 ;
c2=98 ;
printf(“%c %c n",c1,c2);
printf(“%d %d n",c1,c2);
}
运行结果:a b
97 98
注:*输出形式取决于printf函数中的格式符
*格式符为“%c”时输出的变量值为字符
*格式符为“%d"时输出的变量值为整数
三、对字符数据进行算术运算
*实质是对其ASCII值进行算术运算
大小写字母的转换
#include <stdio.h>
void main( )
{char c1,c2 ;
c1=‘a’ ;
c2=‘b’ ;
c1=c1-32; //小写字母比大写字母的ASCII码大(32)10
c2=c2-32;
printf(“%c %c ",c1,c2);
}
*字符型与整型间互相赋值
例: 互相赋值
#include <stdio.h>
void main( )
{int c1;
char c2 ;
c1=‘a’ ;
c2=98 ;
c1=c1-32;
c2=c2-32;
printf(“%c %c ",c1,c2);
}
运行结果为:A B

字符串常量

一、定义:用双引号(“ ”)括起来的字符序列
“How do you do” , “CHINA” , “a” , “$123.45”
二、存储:每个字符串尾自动加一个 ‘0’ 作为字符串结束标志

e194fd196ae48a4abbad14256e75c2d4.png

74f17409be6c15d60f9152a3a08a6b43.png


注:没有字符串变量,只能用字符数组存

变量赋初值

1.变量的使用:先定义,后使用
2.变量定义位置:一般放在函数开头
3.变量初始化:可以在定义时赋初值

19e453f6143192d2f1c0fa28ebafccf3.png

各类数值型数据间的混合运算


整型、实型、字符型数据间可以混合运算
一、自动转换
1.什么情况下发生
*运算转换------不同类型数据混合运算时
*赋值转换------把一个值赋给与其类型不同的变量时
*输出转换------输出时转换成指定的输出格式
*函数调用转换------实参与形参类型不一致时转换
2.运算转换规则:不同类型数据运算时先自动转换成同一类型

c596f66e20734a87c0d2211ec50e3ac3.png


二、强制转换(见P56强制类型转换运算符部分)
1.一般形式:(类型名)(表达式)
例:(int)(x+y) //强制类型转换运算符
(int)x+y
(double)(3/2)
(int)3.6
2.说明:强制转换得到所需类型的中间变量,原变量类型不变

#include <stdio>
main()
{ float x;
int i;
x=3.6;
i=(int)x; //表达式仅一个变量时,括号可以省略
printf(“x=%f,i=%d”,x,i);
}
结果:x=3.600000,i=3
注:较高类型向较低类型转换时可能发生

算术运算符和算术表达式

d473b90c184a9294db428cc896948318.png


一、算术运算符和算术表达式
1.基本算术运算符: + - * / %
*结合方向:从左向右
*优先级:- ---->* / % -----> + -
(2) (3) (4)
说明:
1.“-”可为单目运算符时,右结合性
2. 两整数相除,结果为整数
3. %要求两侧均为整型数据
4.+ - * / 运算的两个数中有一个数为实数,结果是double型
例 5%2 = 1
-5%2 = -1
1%10 = 1
5%1 = 0
5.5%2 ()
二、自增、自减运算符++ --
1.作用:使变量值加1或减1
2.种类:
*前置 ++i, --i (先执行i+1或i-1,再使用i值)
*后置 i++,i-- (先使用i值,再执行i+1或i-1)
例j=3; k=++j; //k=4,j=4
j=3; k=j++; //k=3,j=4
j=3; printf(“%d”,++j); //4,j=4
j=3; printf(“%d”,j++); //3,j=4
a=3;b=5;c=(++a)*b; //c=20,a=4
a=3;b=5;c=(a++)*b; //c=15,a=4
几点说明:
1.++ -- 不能用于常量和表达式,如 5++,(a+b)++
2.++ -- 结合方向: 自右向左
3.优先级:- ++ -- ------>* / % ----->+ -
(2) (3) (4)
4.该运算符常用于循环语句中,使循环变量加减1
例 -i++ //-(i++)
i=3; printf(“%d”,-i++); //-3
三、有关表达式使用中的问题说明
1.不同系统对运算符和表达式的处理次序不同,尽可能写通用性强的语句
2.不要写有歧义和不知系统如何执行的程序

赋值运算符和赋值表达式

一、简单赋值运算符
1.符号: =
2.格式: 变量标识符=表达式
3.作用:将一个数据(常量或表达式)赋给一个变量
4.左侧必须是变量,不能是常量或表达式
例 a=3; d=func(); c=d+2;
例 3=x-2*y; a+b=3; (×)
二、类型转换
1.赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型
例1: float f ; int i=10; f=i;
则 f=10.0
例2:int i;
i=2.56; //结果i=2;
三、复合赋值运算符
1.种类:+= -= *= /= %= 《= 》= &= ^= |=
2.含义:exp1 op= exp2  exp1 = exp1 op exp2
四、赋值表达式
1.形式:<变量> <赋值运算符> <表达式>
2.赋值表达式的值与变量值相等,且可嵌套
例: a=b=c=5 //表达式值为5,a,b,c值为5
a=(b=5) // b=5;a=5
a=5+(c=6) //表达式值11,c=6,a=11
a=(b=4)+(c=6) //表达式值10,a=10,b=4,c=6
a=(b=10)/(c=2) //表达式值5,a=5,b=10,c=2逗号运算符和逗号表达式1.形式:表达式1,表达式2,……表达式n
2.结合性:从左向右
3.优先级: 15,级别最低
4.逗号表达式的值:等于表达式n的值
5.用途:常用于循环for语句中
例 a=3*5,a*4 //a=15,表达式值60
a=3*5,a*4,a+5 //a=15,表达式值20
例 x=(a=3,6*3) //赋值表达式,表达式值18,x=18
x=a=3,6*a //逗号表达式,表达式值18,x=3
例 a=1;b=2;c=3;
printf(“%d,%d,%d”,a,b,c); //1,2,3
printf(“%d,%d,%d”,(a,b,c),b,c); //3,2,1
例: 逗号表达式使用
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%dn",x);
}
运行结果:X=3

0958628e0f1430cc7ed624ab5224678f.png

公众号:学生成才
内容:提供更好的学习资源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话的意思是,const char*类型char*类型兼容。也就是说,这两种类型的指针不能直接互相赋值或传递数,因为它们的类型不同。const char*是指向常量字符的指针,而char*是指向字符的指针,没有常量限制。因此,如果要将const char*类型的指针传递给char*类型,需要进行类型转换或者修改类型。 ### 回答2: C++中,const char*类型参与char*类型兼容。这是因为本质上,这两种类型虽然都指向字符数组,但是其所在的内存空间以及内存中存储的内容是不同的。 const char*是指向常量字符数组的指针。其中,常量表示该字符数组的内容不可被修改,因此,通过const char*指针访问的该字符数组的内容也不能被修改。 而char*则是指向可修改字符数组的指针。即,通过char*指针访问的该字符数组的内容是可以被修改的。 由于const char*指针不能修改其所指向字符数组的内容,不同于char*指针可修改其所指向字符数组的内容,这两种类型的指针定义的变量是位于不同的内存区域中。因此,当我们将一个const char*类型的变量传递给char*类型时,会发生类型转换错误,因为其参与兼容。 在程序开发中,为了避免这种类型转换错误的问题,我们应该尽量使用const char*类型的变量代替char*类型的变量,特别是当我们不需要修改字符数组时,更是这样。在函数的中,如果我们要传递一个不可修改的字符数组时,应该使用const char*类型,以避免类型转换错误。 ### 回答3: const char*类型参与char*类型兼容,这个问题主要出现在C++编程语言中。在许多情况下,我们可能需要使用字符串来作为函数的来传递或接收函数的返回值。在C++中,我们可以使用char*类型来表示一个字符串,而const char*则表示一个常量字符指针,其指向的字符串内容是不可修改的。 由于const char*指针指向的字符串内容是只读的,因此如果我们将const char*类型作为char*类型传递给函数,则可能会导致潜在的不安全性问题。这是因为char*指针可以修改其指针所指向的字符串的内容,而const char*指针不允许修改其指针所指向的字符串的内容。如果我们尝试强制将const char*类型转换为char*类型的指针,并试图通过该指针修改其指向的字符串内容,则可能会导致未定义的行为。 举个例子,假设我们有一个函数,其类型char*,该函数尝试修改其数所指向的字符串的内容。如果我们将一个const char*类型作为该函数的数进行调用,则该函数试图修改const char*指针所指向的字符串的内容,这可能会导致程序错误或崩溃。 为了解决这个问题,我们可以将char*类型改为const char*类型的指针。这样做会使得函数无法修改传递给它的字符串内容,防止出现不安全行为。如果我们想要修改传递给函数的字符串内容,则应该使用char*类型的指针作为类型。但是,在进行这样的操作时,我们需要注意确保我们正在处理的字符串内容可以被修改,并且不会对程序的其他部分产生负面影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值