printf()函数输出八进制或十六进制,在输出前显示0和0x的操作
void main(void)
{
int temp = 100;
printf("10:%d 8:%o 16:%x\n", temp, temp, temp);
printf("10:%d 8:%#o 16:%#x\n", temp, temp, temp);/*加 # 可使得输出进制前加上说明*/
system("pause");
}
/*输出
10:100 8:144 16:64
10:100 8:0144 16:0x64
*/
整数的溢出,其实结果很简单,若是有符号则从负的最小重新开始,若是无符号,则从0开始,不过一句话还是挺耐人寻味
“溢出行为是未定义的行为,C标准并未定义有符号类型的溢出规则,所以以上描述的溢出行为比较有代表性,但是也可能出现其他情况”
这里介绍一个有趣的转义字符 \a 它可以进行蜂鸣器报警
void main(void)
{
char temp = '\a';
printf("%c" , temp);
system("pause");
}
/*运行这段代码后,可以听到一声蜂鸣器........原来还是这样的操作*/
转义字符 \r \n \r\n这几项,\r意味着将光标转到开始,\n意味着将光标换行,那么问题来了,\r\n应该是先将光标转到开始,然后再换行,我们用word的时候会有这个印象,在段落的最前面按下回车的话,是在当前行的上面新建一个行,但是在这里并不是这样,\r 意味着一个回车
printf() 和scanf()的一些高级的用法
二元运算符+ - * / 在执行结合律是是从左往右 而= 号是从右往左
求模运算符 % 只能用于整数,不能用于浮点数
负数求模如何运算?
如果第一个运算符是负数,则求模的结果为负数,如果第一个运算符为正数,则求模结果为正。
11/5 得 2 , 11%5 得 1
11/-5 得 -2 , 11%-5 得 1(书上这里写的是11%-2,给人感觉像是不小心写错了,但是并没有什么影响)
-11/-5 得 2 , -11%5 得 -1
-11/5 得 -2 , -11%5 得 -1
计算机内求模(a%b)的表达式: a - (a/b) * b
递增和递减运算符的一些小细节
若有这样的语句:
n = 3;
y = n++ + n++;
结果y的值存在多种可能,因为编译器可以自己选择先对哪个参数求值,所以可能y = 3+3 或y = 3+4。
所以,一个表达式中不对出现多次的变量使用递增和递减。(虽然也没有这么做过,但是这些细节以前没有去想过)
这里提到C语言的副作用和序列点的概念,是第一次了解到
利用循环和scanf来跳过输入的内容(比如说跳过输入到达第一个既不是空白也不是数字的位置)的一种方法
while(scanf("%d",&num) == 1)
{
; /*注意这个*/
}
关系运算符可以用来比较浮点数,但是注意,在比较浮点数时,尽量只使用<和>,因为浮点数的舍入误差会导致在逻辑上应该相等的两个数不相等,比如:
3乘以1/3的积是1.0,但是如果把1/3用小数点表示后6位,则是0.999999,不等于1;
另外,比较浮点数可以使用fabs()函数,在头文件
在C中,一般而言,所有非0值都视为真,只有0被视为假,“真”的概念很宽
如果scanf()读取指定形式的输入失败,就把无法读取的输入留在输入队列中,供下次读取
for循环可以有这样的写法:
for(printf("do you know that?\n");num!=6;)
{
}
C语言中的逗号表达式运用
一个要注意的潜在陷阱,也是很多内存出错问题的来源,考虑到执行的速度,C编译器不会去检查数组的下标是否正确
字符的判断,可以使用
帮助记忆 | |和 &&的区别,书中给了很方便记忆的一条公式
(练习&&时间 == 完美)
求值顺序,这里将再次讲到序列点的知识。感觉最好还是不要再一个表达式中对对此出现的变量执行++或–保险一点
C语言不建议使用goto语句,但是goto一个可能出现的地方就是,goto可以从一组嵌套循环中跳出,而break只能跳出当前循环