大部分为书的内容,小部分自己的理解
目录
关于变量名
数据类型及长度
常量
声明
算术运算符
关系运算符与逻辑运算符
类型转换
自增运算符与自减运算符
位运算符
赋值运算符与表达式
条件表达式
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”,这二者没有区别;
一般来说,如果二元运算符(具有两个操作数的运算符称为二元运算符,比如+或*)的两个操作数具有不同的类型,那么在进行运算之前先要把“较低”的类型提升为“较高”的类型;
注意⚠️,表达式中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{ ... }