近期发现的一些-20190519

一、关于符号优先级问题

算数运算符>关系>逻辑>赋值; //引用BJ内容

例如a[i]+=a[i-1]+a[i-2];表示a[i-1]先和a[i-2]相加,其结果和a[i]完成相加等于的操作。


二、对于for循环中的终止值
例如

for(k=1;k<=6;k++)
{
    printf("will 520\n");
}
printf("%d",k);//此处k已经从6加到了7

这里将打出6个will 520和k的值7。


三、对\0结束字符的替换来阻止结束
例如

#include <stdio.h>
int main()
{
    char a[4][5]={"cosz","abcd","efjh","hijk"};
    a[0][4]='s';
    puts(a[0]);//此处a[0]是首地址,因为是二维数组所以不是a而是a[0],表示从首地址开始连续打印,遇到\0结束
}

输出
coszsabcd


四、从地址位置开始输出打印
若为一维数组
puts(&a[3]);表示从a[3]位置开始连续输出遇到\0结束
若为二维数组,见<三>中内容


五、宏定义函数
一直用宏定义定义常量,容易忽略宏定义函数的写法

define A(A,B)  (((B)+(A)%((A)*(B)))

表示一个函数名为A的带有形式参数AB的函数,函数内容为后面括号中的内容,引用时例如printf("%5d",A(x,y));即可


六、关于++a和a++

a++表示先用a进行运算,后加1;
++a表示先把a加1,后进行运算。

依照例子来说明

int a=0,b=1,c=0;
for(;;)
{
    if(a++||--b||c++)//第一次训进入循环时,第一部分为0看第二部分,第二部分为0看第三部分,第三部分为0本次不打印ok,进入第二次循环,此时a已经变成1,成立进入循环。
    {
        printf("ok");
    }
}

七、指针声明的复杂形式
先介绍一个法则——左右法则,官方给出的解释是:

The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

即首先从最里面的圆括号内未定义的标识符开始阅读看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

下面用几个例子来解释:
-------例一:

int* (*a[5])(int, char*);

首先看到标识符名a,a是一个数组,这个数组有5个元素,每一个元素都是一个指针,指针指向int* (int, char*),指向的是一个函数,这个函数参数是int, char*,返回值是int*
  
-------例二:

int(*)() (*c)[9];

c是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是int(*)()(也是一个函数指针,指向一个函数,这个函数的参数为空,返回值是int型)。


八、关于数组在各个表达式中的传递

  1. 数组在scanf、gets、printf中的应用
    例如下面:
char str[100];
printf("please input:\n");
gets(str) ;//注意这里并不是gets(str[])
-----这里的语句还可以替换成
scanf("%s",str);//表示从str位置开始输入,此处str相当于首地址
-----
printf("%s",str);//注意这里相当于从str开始持续输出,见<四>,可以减少用数组的各种问题
  1. 数组在函数调用中的应用
    例如下面:
int exchange(char str[])
{.....}
int main()
{
    char str[100];
    printf("please input:\n");
    gets(str);
    exchange(str)//注意这里传入并不是数组形式,而是把指针传入,区别于别的变量
  1. 数组在strlen函数中的应用
    首先需要注意strlen的两个问题:
    ①引用strlen函数需要包含string.h头文件
    ②strlen函数计算长度不计算\0结束符
    下面举例子:
int main()
{
    char str[100];
    printf("please input:\n");
    gets(str);
    strlen(str);//注意这里也不是加数组而是加数组名
}

九、时刻注意变量的有效域
一般用于储存数据的数组应放在主函数中,除了main以外的主函数可以用了更换位置、累加计算等等,但是不适合用来储存数据数组。(文件除外)

发布了20 篇原创文章 · 获赞 12 · 访问量 3968

猜你喜欢

转载自blog.csdn.net/Athus_c/article/details/90349541