C语言学习记录 运算符(个人记录)

大部分为书的内容,小部分自己的理解

目录

关于变量名

数据类型及长度

常量

声明

算术运算符

关系运算符与逻辑运算符

类型转换

自增运算符与自减运算符

位运算符

赋值运算符与表达式

条件表达式

if-else

在任何一种编程语言中,如果代码的执行结果与求值顺序相关,则都是不好的程序设计风格。


部分内容来自书上,部分是个人想法

关于变量名

名字第一个字符必须为字母和下划线,因为下划线“_”被看作字母。        

 书上记录的是用于命名较长的变量名,但又由于库例程的名字通常以下划线开头,因此变量名不要以下划线开头(到目前还没见过所以不太理解)


数据类型及长度

short与int类型至少为16位,而long类型通常为32位,并且short类型不得长型于int类型,而int类型不得长于long类​​​​​​​型;

类型限定符signed与unsigned可用于限定char类型或任何整型,如果char对象占用8位,那么unsigned char类型变量的取值范围位0~255;而signed char类型变量的取值范围则为-128~127;

long类型表示高精度的浮点数; 

 但是同整型,浮点型的长度都取决于具体的实现。


常量

long类型通常以字母l或者L结尾,如:1234L或1234l;(如果一个整数太大以至于无法用int类型表示,也将被当作long类型处理) 

无符号常量以字母u或U结尾;        后缀ul或UL表明是unsigned long类型;

没有后缀的浮点数常量为double类型。后缀f或F表示float类型,而后缀l或L则表示long double类型; 

感觉float用的比较少,更多使用的是double; 

带前缀0的整型常量表示它为八进制形式;前缀为0x或0X,则表示它为十六进制。例:十进制数31可以写成八进制形式 031 ,也可以写成十六进制形式0xlf或0X1F。

编程对于大小写的控制还是很严谨啊; 

相同的八进制与十六进制的常量也可以使用后缀L表示long类型,使用后缀U表示unsigned类型。例:0XFUL是一个unsigned long类型,其值相当于十进制数15;

字符常量‘\0’表示值为0的字符,也就是空字符(null),也可以使用‘\0’的形式代替0,以强调某些表达式的字符属性,但其数值为0;

常量表达式是仅仅包含常量的表达式。

字符串常量就是字符数组。字符串的内部表示使用一个空字符‘\0’作为串的结尾。因此,储存字符串的物理存储单元数比括在双引号中的字符数多一个。

‘x’与"x"的区别:前者是一个整数,其值是字母x在机器字符集中对应的数值(内部表示值);后者是一个包含一个字符(即字母x)以及一个结束符‘\0’的字符数组。

不同枚举中的名字必须互不相同。同一枚举中不同的名字可以具有相同的值; 


声明

 任何变量的声明都可以使用count限定符限定。该限定符指定变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改;

const double e = 2.71823823324;
const char mag[] = "warning:";

const限定符也可配数组参数使用,它表明函数不能修改数组元素的值; 

int strlen(const char[])


算术运算符

取模运算符%不能应用于float或double类型;

二元运算符+和-具有相同的优先级,它们的优先级比*、/和%的优先级低,而运算符*、/和%的优先级低,而运算符*、/和%的优先级又比一元运算符+和-的优先级低; 

一元运算符我理解的是:自减--与自加++,负号(-10);


关系运算符与逻辑运算符

关系运算符的优先级比算术运算符的优先级低;

运算符&&的优先级比||的优先级高;但两者都比关系运算符和相等性运算符的优先级低;

逻辑运算符<关系运算符<相等性运算符;


类型转换

一般来说,自动转换是指把“比较窄的”操作数转换为“比较宽的”操作数;

储存在字符变量中的位模式在某些机器中可能为负的,而在另一些机器中可能是正的。为了保证程序的可移植性,如果要在char类型的变量中储存非字符数据,最好指定signed或unsigned限定符;

在if 、 while 、 for等语句的测试部分中,“真”就意味着“非0”,这二者没有区别;

一般来说,如果二元运算符(具有两个操作数的运算符称为二元运算符,比如+或*)的两个操作数具有不同的类型,那么在进行运算之前先要把“较低”的类型提升为“较高”的类型;

  • 如果其中一个操作数的类型为long double,则将另一个操作数转换为long double类型;
  • 如果其中一个操作数的类型为double,则将另一个操作数转换为double类型;
  • 如果其中一个操作数的类型为float,则将另一个操作数转换为double类型;
  • 将char与short类型的操作数转换为int类型;
  • 如果其中一个操作数的类型为long,则将另一个操作数也转换为long类型; 

注意⚠️,表达式中float类型的操作数不会自动转换为double类型,这一点与最初的定义有所不同;

赋值是也要进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型;

由于函数调用的参数是表达式,所以在把参数传递给函数时也可能进行类型转换。在没有函数原型的情况下,char与short类型都将被转换为int类型,float类型将被转换为double类型; 

在任何表达式中都可以使用一个称为 强制类型转换 的一元运算符强制进行显式类型转换。下列语句中,表达式将按照上述转换规则被转换为 类型名 指定的类型:

(类型名)表达式

 其实还不是特别了解sqrt的作用,但是书中频频引用,哭了。


自增运算符与自减运算符

在不需要使用任何具体值仅需要递增变量的情况下,不管作为前缀运算符还是作为后缀运算符效果都是将值增加1;

不同的是++n先将n的值递增1,然后再使用变量n的值;而n++则是先使用变量n的值,然后再将n的值递增1.

x = n++;    //x -> 5    n -> 6

x = ++n;    //x -> 6    n -> 6

 注意⚠️ 表达式(i+j)++是非法的。


位运算符

等理解了再写上去;


赋值运算符与表达式

i = i + 2;可以缩写为 i += 2;其中的+=称为赋值运算符;

expr1 op = expr2;    等价于     expr1 = (expr1)op (expr2);

x *= y + 1的含义是 x = x * ( y+1 ) 并非 x = x * y + 1;

 赋值表达式更接近我们的思维 ,我们通常会说“把2加到i上”或“把i增加2” , 而不会说“取i的值,加上2,再把结果放回到i中”

在所有的这类表达式中,赋值表达式的类型是它的左操作数的类型,其值是赋值操作完成后的值;


条件表达式

if-else

if(条件){
...
}else{
...
}


在任何一种编程语言中,如果代码的执行结果与求值顺序相关,则都是不好的程序设计风格。

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/120771636