经典入门“hello world!”
*源文件:hello.c
*头文件:用#include包含
*关键字:关键字,32个关键字。main是主函数,程序运行入口。return是函数结束的标志。
*符号:#号是C语言的一种符号,%取余符号 ,++、–、&、|、~、!、;(一句代码的结束标志)。
注释://注释一行代码的,多行的语句就用/…*/注释。
*变量:是变化的,在计算过程中会发生变化的量。
*函数:函数小括号里面参数列表,紧跟一对花括号,话括号里面是函数体。
步骤:
编辑、编译、运行、调试
数据类型:整形(long int, short), 浮点型, 字符型。
负数、隐式转换
字节:所有的系统里面,一个字节占8bit。整形占4个字节32位。
知识点:
过程:编辑、编译、运行、调试。
在redhat环境下:
编辑:用vim命令打开.c文件编辑
编译:使用cgg,cgg xxx.c,-o可指定.out文件名
运行:编译之后生成.out文件,输入文件目录即编译
调试:根据编译生成的error,重新打开源文件进行调试
补充:
gcc生成可执行的二进制文件
知识点
sizeof是运算符,计算变量或类型所占空间的大小字节数
知识点
从右向左执行
对于判断语句,前置与后置效果不同,对于赋值语句,效果相同
知识点
if和else之间不能有其他语句
选择项大于2应使用elseif
知识点
每一个case必须有break
switch入口不可以是小数
知识点
for(初始条件;终止条件;循环增量)
知识点
while条件后必须加分号
1、位与&
(1)注意:位与符号是一个&,两个&&是逻辑与。
(2)真值表:1&0=0 1&1=1 0&0=0 0&1=0
(3)从真值表可以看出:位与操作的特点是,只有1和1位于结果为1,其余全是0.
(4)位与和逻辑与的区别:位与时两个操作数是按照二进制位彼次对应位相与的,逻辑与是两个操作数作为整体来相与的。(举例:0xAA&0xF0=0xA0, 0xAA && 0xF0=1)
2、位或|
(1)注意:位或符号是一个|,两个||是逻辑或。
(2)真值表:1|0=1 1|1=1 0|0=0 0|1=1
(3)从真值表可以看出:位或操作的特点是:只有2个0相位或才能得到0,只要有1个1结果就一定是1.
(4)位或和逻辑或的区别:位或时两个操作数是按照二进制位彼次对应位相与的,逻辑或是两个操作数作为整体来相或的。
3、位取反~
(1)注意:C语言中位取反是~,C语言中的逻辑取反是!
(2)按位取反是将操作数的二进制位逐个按位取反(1变成0,0变成1);而逻辑取反是真(在C语言中只要不是0的任何数都是真)变成假(在C语言中只有0表示假)、假变成真。
4、位异或^
(1)位异或真值表:1^1=0 0^0=0 1^0=1 0^1=1
(2)位异或的特点:2个数如果相等结果为0,不等结果为1。记忆方法:异或就是相异就或操作起来。
5、左移位<< 与右移位>>
C语言的移位要取决于数据类型。
对于无符号数,左移时右侧补0(相当于逻辑移位)
对于无符号数,右移时左侧补0(相当于逻辑移位)
对于有符号数,左移时右侧补0(叫算术移位,相当于逻辑移位)
对于有符号数,右移时左侧补符号位(如果正数就补0,负数就补1,叫算术移位)
5、左移位<< 与右移位>>
C语言的移位要取决于数据类型。
对于无符号数,左移时右侧补0(相当于逻辑移位)
对于无符号数,右移时左侧补0(相当于逻辑移位)
对于有符号数,左移时右侧补0(叫算术移位,相当于逻辑移位)
对于有符号数,右移时左侧补符号位(如果正数就补0,负数就补1,叫算术移位)
嵌入式中研究的移位,以及使用的移位都是无符号数
位与、位或结合特定二进制数即可完成寄存器位操作需求
(1)如果你要的这个数比较少位为1,大部分位为0,则可以通过连续很多个1左移n位得到。
(2)如果你想要的数是比较少位为0,大部分位为1,则可以通过先构建其位反数,然后再位取反来得到。
(3)如果你想要的数中连续1(连续0)的部分不止1个,那么可以通过多段分别构造,然后再彼此位与即可。这时候因为参与位或运算的各个数为1的位是不重复的,所以这时候的位或其实相当于几个数的叠加。
1.给定一个整型数a,设置a的bit3(为1),保证其他位不变。
2.给定一个整形数a,设置a的bit3~bit7,保持其他位不变。
4.给定一个整形数a,清除a的bit15~bit23,保持其他位不变。
6.用C语言给一个整形数的bit7~bit17赋值937(其余位不受影响)。
7.用C语言将一个整形数的bit7~bit17中的值加17(其余位不受影响)。
8.用C语言给一个整形数的bit7~bit17赋值937,同时给bit21~bit25赋值17。
#include
int main()
{
char n[6][6] = {' '};//行数列数从1开始
//先给第三行和第三列全部赋值为*
int i = 0;
for (i = 1; i < 6; i++)
{
n[3][i] = '*';
n[i][3] = '*';
}
//再给中间的正方形赋值为*
int j = 0;
i = 0;
for (i = 2; i < 5; i++)
{
for (j = 2; j < 5; j++)
{
n[i][j] = '*';
}
}
//输出
int r = 1;
int c = 1;
for (r = 1; r < 6; r++)
{
for (c = 1; c < 6; c++)
{
printf("%c", n[r][c]);
}
printf("\n");
}
return 0;
}