本文目录一览:
C语言中赋值语句的语法是怎样的
赋值的语法规则就是:
数据类型 变量名 = 表达式
表达式可以理解为一个值或一个计算公式就行,表达式加一个英文符号分号就是语句。
例如:
我们今天要用到的,我买了几斤苹果。
就可以这样写:
方式一:
Int apple_count = 0; //告诉计算机apple_count是用来存买苹果的斤数的,默认为0;
方式二:
Int apple_count; //告诉计算机apple_count是用来存买苹果的斤数的,以后再告诉计算机它等于多少,现在不知道;
扩展资料
1、C语言中,赋值运算的操作是有方向的,即将右侧表达式的值(也称为右值)赋值左侧的变量,只能是标识一个特定存储单元的变量名。
2、由于变量名只能出现在赋值运算符的左边,因此它也被称为左值;由于常量只能出现在赋值运算符的右边,因此它也被称为右值。左值可以用作右值,但右值不能用作左值。
在C语言中的各种赋值是如何转换的?
关于赋值操作,你可以查看一下博客的内容,初学者不用理解底层汇编的实现机制,有点晦涩,随着自己的进步可以进一步的深入底层查看其实现原理
1 代码案例
iint main()
{
int n,m;
char ch;
float f = 12.12;
double d=121.111;
n = f; //单精度浮点赋值给整数
m =d; //双精度浮点赋值给整数
ch = n; //整数赋值给字符值
ch = f; //浮点赋值给字符值
f = d; //整数变量赋值给浮点变量;
return 0;
}
2 以上代码调试运行对应的汇编代码分析
101: float f = 12.12; //单精度浮点赋值:占用4个字节,需要1条汇编指令实现
源代码对应1条汇编指令:
00401C78 mov dword ptr [ebp-10h],4141EB85h
102: double d=121.111; //双精度浮点赋值:占用8个字节,需要2条汇编指令实现
源代码对应2条汇编指令:
00401C7F mov dword ptr [ebp-18h],9FBE76C9h
00401C86 mov dword ptr [ebp-14h],405E471Ah
103: n = f; //单精度浮点赋值给整数
源代码对应3条汇编指令:
00401C8D fld dword ptr [ebp-10h]
00401C90 call __ftol (004232cc)
00401C95 mov dword ptr [ebp-4],eax
104: m =d; //双精度浮点赋值给整数
源代码对应3条汇编指令:实际的类型转换通过调用内部C运行时接口函数__ftol来实现类型转换。
00401C98 fld qword ptr [ebp-18h]
00401C9B call __ftol (004232cc) //调用__ftol函数(对应15条汇编指令,见下面3描述)
00401CA0 mov dword ptr [ebp-8],eax
105: ch = n; //整数赋值给字符值
源代码对应2条汇编指令:
00401CA3 mov al,byte ptr [ebp-4]
00401CA6 mov byte ptr [ebp-0Ch],al
106: ch = f; //浮点赋值给字符值
源代码对应3条汇编指令:
00401CA9 fld dword ptr [ebp-10h]
00401CAC call __ftol (004232cc)
00401CB1 mov byte ptr [ebp-0Ch],al
107: f = d; // 整数转换为浮点数,源代码对应2条汇编指令:
00401CB4 fld qword ptr [ebp-18h]
00401CB7 fstp dword ptr [ebp-10h]
3 赋值涉及的__ftol函数对应的汇编指令:
__ftol 函数对应以下16条指令:
004232CC push ebp
004232CD mov ebp,esp
004232CF add esp,0F4h
004232D2 wait
004232D3 fnstcw word ptr [ebp-2]
004232D6 wait
004232D7 mov ax,word ptr [ebp-2]
004232DB or ah,0Ch
004232DE mov word ptr [ebp-4],ax
004232E2 fldcw word ptr [ebp-4]
004232E5 fistp qword ptr [ebp-0Ch]
004232E8 fldcw word ptr [ebp-2]
004232EB mov eax,dword ptr [ebp-0Ch]
004232EE mov edx,dword ptr [ebp-8]
004232F1 leave
004232F2 ret
4 C运行库(Run-Time Library)存在的原因
4.1 定义(摘自《软件调试》,张银奎)
当编译器在将高级语言编译到第几语言的过程是,因为高级语言中的某些比较负责的运算符(如不同的类型转换)要对应比较多的低级语言指令(如汇编、机器指 令),为了防止这样的指令段多次重复出现在目标代码中(造成目标码过大),编译器通常将这些指令段封装为函数,然后将高级语言的某些操作翻译为函数调用。
C标准定义了标准C函数,C++标准定义了C++标准类库,这些库通常被称为支持库,这些库是程序编译运行的必要条件,因此支持库也称为运行库(Run-Time Library).
VC提供了C和C++运行库。
4.2 例子
1)如上面例子,VC编译器通常将 n =f( n :整数,f:浮点数)这样的赋值编译为调用__ftol函数;
2)VC编译器也将new ,delete 操作符编译为对malloc和free函数调用(可以通过单步调试运行,反汇编单步跟着call 指令观察分析验证!)
5 总结
1)通过以上分析,不同类型变量转换,是编译程序在编译程序过程中,将操作转换编译成调用运行库函数来实现的。
2)一般程序设计过程中,不是必要情况下,不要频繁使用不同类型互相转换的操作,特别是涉及到循环运算、性能的优化的程序!
c语言赋值是替换的意思么?
我觉得可以这样理解啊,比如你声明一个a,系统会随机分配一个值给a,直到你给a赋了值,你赋的值就会替换掉a原来的值,此时a就等于你所赋的值。
C语言交换变量值的几种方法
方法一:三变量交换。
#includestdio.h
int main(void)
{
int a,b;
scanf("%d%d",a,b);
int t=a;a=b;b=t;
printf("%d %d\n",a,b);
return 0;
}
方法二:加减交换
#includestdio.h
int main(void)
{
int a,b;
scanf("%d%d",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("%d %d\n",a,b);
return 0;
}
方法三:异或交换
#includestdio.h
int main(void)
{
int a,b;
scanf("%d%d",a,b);
a=a^b;b=b^a;a=a^b;//可写成a^=b^=a^=b;
printf("%d %d\n",a,b);
return 0;
}
方法四(黑盒测试下):不交换
#includestdio.h
int main(void)
{
int a,b;
scanf("%d%d",a,b);
printf("%d %d\n",b,a);
return 0;
}
C语言交换语句的赋值问题
当然不变,程序中定义的任何变量都是有值的,即使你说的T没赋值,程序也会在初始化得时候给它一个随机赋值,赋值只是将目标变量的值拷贝给当前变量,所以目标变量的值是不会发生改变的。