c语言基本符号:
先看几条有关注释的语句:
int/*...*/i; 和in/*…*/t i; 到底哪一条是对的?
我们一般用的注释符号是/*...*/ 和//
/*...*/ 注释部分其实就相当于一个空格
下面就可以解释了 int/*...*/i 就是 int i;
而in/*...*/t i 就表示为in t i显然没有in t这种类型 即它是错误的。
在看这么一条语句
/*这是*/#/*一条*/define/*合法的*/ID/*预处理*/replacement/*指*/list/*令*/
不看注释 其实就是 # define ID replacement list
找出这条语句的问题:
y = x/*p
编译器认为 是 y = x(/*)p 把/*当成是一个注释符 而不是 x/(*p) 。 /*把p给注释掉一直等待(*/)符号
要改的话 有两种:
1 y = x/ *p
2 y = x/ (*p)
也就是说只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始
接续符和转义符:
C 语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符
自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格
例如 cout<<"we must study c\
++ hard!";
则 输出 cout<<"we must study c++ hard! ;
转义字符'\' 意思是将反斜杠(\)后面的字符转换成另外的意义。
如 '\n'中的字母"n"不代表n而作为换行符。
例如 '\101' 代表8进制数形式ASCII码101代表的字符
即101 化为8进制为 001 000 001 十进制数就是65 即代表字符"A"。
'\012' 012 的八进制为000 001 010十进制的10代表 "换行"
再比如 '\a' a的ASCII码为97 97化为八进制数为000 111 即为ASCII码的7 因为八进制最大数为7 所以9的八进制为0.
\ddd 1~3 位八进制数所代表的字符
\xhh 1~2 位十六进制数所代表的字符
广义地讲,C 语言字符集中的任何一个字符均可用转义字符来表示。表中的\ddd 和\xhh
正是为此而提出的。ddd 和hh 分别为八进制和十六进制的ASCII 代码。如\102 表示字母"B",
\134 表示反斜线,\X0A 表示换行等。
单引号、双引号
双引号引起来的都是字符串常量,单引号引起来的都是字符常量
比如:‘a’和“a”完全不一样,在内存里前者占1 个byte,后者占2
个byte。 因为 'a'表示字符为1个字节 肯定是的 "a"是个字符串 包括'\0'所以多一个字节
逻辑运算符
||和&&是我们经常用到的逻辑运算符,与按位运算符|和&是两码事
int i=0;
int j=0;
if((++i>0)||(++j>0))
{
//打印出i 和j 的值。
}
结果:i=1;j=0。
逻辑运算符||两边的条件只要有一个为真,其结果就为真;只要有一个结果
为假,其结果就为假。if((++i>0)||(++j>0))语句中,先计算(++i>0),发现其结果为真,后面
的(++j>0)便不再计算。
位运算符
C 语言中位运算包括下面几种:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干
位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若
干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同
移动。当为正数时, 最高位补0;而为负数时,符号位为1
例如:
0x01<<2+3; 是多少?
此处要考虑优先级的问题
“+”号的优先级比移位运算符的优先级高
所以此处答案应该是32 就是0x01<<5就变成了0010 0000
++、--操作符
这两个符号我开始学的时候也搞不清楚,现在基本上理解了。
如
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 3;
int j ;
int m;
j = i++;
m = ++i;
printf("j = %d\n",j);
printf("m = %d\n",m);
return 0;
}
可能咋一看觉得是打印 3和4 但是结果却是
j = 3
m = 5
原因很简单 j = i++; 是先使用i然后再加加 当把i的值赋给j以后 i再加1变为了4。
然后 m = ++i; 是先加1后使用此时 i加1为5 把5赋给了m m就等于5。
在看三个例子:
A),j =(i++,i++,i++);
B),for(i=0;i<10;i++)
{
//code
}
C),k = (i++)+ (i++)+ (i++);
A) 例子为逗号表达式,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。
关于逗号表达式与“++”或“--”的连用,还有一个比较好的例子:
int x;
int i = 3;
x = (++i, i++, i+10);
问x 的值为多少?i 的值为多少?
按照上面的讲解,可以很清楚的知道,逗号表达式中,i 在遇到每个逗号后,认为本计算
单位已经结束,i 这时候自加。所以,本例子计算完后,i的值为5,x的值为15。
B) 例子i 与10 进行比较之后,认为本计算单位已经结束,i 这时候自加。
C) 例子i 遇到分号才认为本计算单位已经结束,i 这时候自加。
1、3/(-2)的值是多少?
2、3%(-2)的值是多少?
3、-3%(-2)的值是多少?
4、(-3)%(2)的值是多少?
第一个除法好回答 肯定是-1,至于后面关于求余运算也是一样的吗?
上机试了答案是
1
-1
1
有结果分析求余运算后的符号跟被除数的符号相同。掌握了这点就不会出错了。不信可以多试几个。
一些容易出错的优先级问题
.的优先级高于* *p.f
对p 取f 偏移,作为
指针,然后进行解除
引用操作。*(p.f)
[]高于* int *ap[]
ap 是个元素为int
指针的数组
int *(ap[]) 其实这就是数组指针。
函数()高于* int *fp()
fp 是个函数,返回
int *
int *(fp()) 其实就是函数指针。
== 和!=高于赋值符
c = getchar() !=EOF
正确解释是这样
c = (getchar() !=EOF)
所以这个地方我们通常要加()
(c = getchar()) !=EOF
逗号运算符在所有运算符中优先级最低
i = 1,2
正确解释:
(i = 1),2