c语言的优先级

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

()

圆括号

(表达式)/函数名(形参表)

.

成员选择(对象)

对象.成员名

->

成员选择(指针)

对象指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2:表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

说明:

同一优先级的运算符,运算次序由结合方向所决定。

优先级口诀

括号成员第一;         括号运算符[]() 成员运算符.  ->

全体单目第二;         所有的单目运算符比如++ -- +(正) -(负) 指针运算*&

乘除余三,加减四;      这个"余"是指取余运算即%

移位五,关系六;       移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;   即== !=

位与异或和位或;       这几个都是位运算: 位与(&)异或(^)位或(|)

"三分天下"八九十;

逻辑或跟与;           逻辑运算符:|| 和 &&

十二和十一;           注意顺序:优先级(||)  底于 优先级(&&)

条件高于赋值,          三目运算符优先级排到 13 位只比赋值运算符和","高

逗号运算级最低!       逗号运算符优先级最低

scanf:

scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。

1
int scanf(const char *format,...);
函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。[1] 
其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。
 
puts:
puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。
int puts(const char *string);
 
exit:
EXIT()是C语言中的一个终止函数。
EXIT_FAILURE是C语言头文件库中定义的一个符号常量,在vc++6.0下头文件stdlib.h中定义如下: #define EXIT_FAILURE 1 .
EXIT_FAILURE 可以作为exit()的参数来使用,表示没有成功地执行一个程序。
EXIT_SUCCESS 作为exit()的参数来使用,表示成功地执行一个程序。

C

语言中的

return, exit, break, continue

。前两个函数使用的同时通常都会带上程序退

出时的状态码,标准

C

 

中有

EXIT_SUCCESS

 

EXIT_FAILURE

两个宏,位于

/usr/include/stdlib.h

中。

是这样定义的的:

 

#define EXIT_FAILURE 1

 

#define EXIT_SUCCESS 0

strncpy:

strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。

1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n>src由于长度达到src NULL,正常复制,特别注意,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。如果n = src串长度,与strcpy一致。注意n的选择当n > dest串长度,dest栈空间溢出产生崩溃异常。
2)src串长度>dest串长度
如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。
综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。
 
在c语言中,数组参数是以引用(reference)形式进行传递的,也就是传址调用,而标量和常量则是按值(value)传递的。
在c语言中,while循环的功能哈其它语言一样,它首先测试表达式的值,如果是假的(0)就跳过循环体。
 
%d,以十进制形式打印一个整型
%o,以八进制形式打印一个整型
%x,以十六进制形式打印一个整型
 
NUL是ASCII字符集中'\0'字符的名字,它的字节模式为全0.
NULL指一个其值为0的指针。他们都是整型值,其值也相同,所以它们可以互换使用。
 
puts函数是gets函数的输出版本,它把指定的字符串写入标准输出并在末尾添上一个换行符。
EOF是一个整型。
(ch = getchar)!=EOF && ch != '\n'
将ch声明成一个整型可以防止从输入读取的字符意外地被解释为EOF。同时,这也意味着接受字符的ch必须足够大,足以容纳EOF,这就是ch使用整型的原因。
 
rearrange(char *output, char const *input, int n_columns, int const columns[])
当数组名作为实参时,传给函数的实际上是一个指向数组起始位置的指针,也就是数组内存中的地址。
由于它的传址调用语义,如果函数修改了形参数组的元素,它实际将修改实参数组的对应元素。
作用有两个,其一,它申明该函数的作者的意图是这个参数不能被修改。
其次,它导致编译器去验证是否违背该意图。
putchar 函数,它与getchar函数相对应,它接受一个整型参数,并在标准输出中打印该字符(字符本质是整数)。
strcpy函数与strncpy函数类似,但它没有限制需要复制的字符数量。
它接受两个参数:第2个字符串参数将被复制到第1个字符串参数,第一个字符串原有的字符将被覆盖。
strcat函数也接受两个参数,但它把第2个字符串参数添加到第1个字符串参数的末尾。
在两个函数中,他们的第1个字符串参数不能是字符串常量。而且,确保目标字符串有足够的空间是程序员的责任,函数并不对其进行检查。
在字符串内进行搜索的函数是strchr,它接受两个参数,第1个参数是字符串,第2个参数是一个字符。这个函数在字符串参数内搜索字符参数第1次出现的位置,
如果搜索成功就返回指向这个位置的指针,如果搜索失败就返回一个NULL指针。strstr函数功能相似,但它的第2个参数也是一个字符串,它搜索第2个字符串在第1个字符串中第1次出现的位置。
 
编程提示的总结:
1、在使用下标前先检查它们的值。
2、始终要进行检查,确保数组不越界。
 
 
 

pointers on c (day 1,chapter1)的更多相关文章

  1. Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II

    题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...

  2. Leetcode 笔记 116 - Populating Next Right Pointers in Each Node

    题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...

  3. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  4. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  6. LEETCODE —— Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

  7. chapter1 渗透测试与metasploit

    网络对抗技术课程学习 chapter1 渗透测试与metasploit 一.读书笔记 二.渗透测试 通过模拟恶意攻击者的技术与方法进行攻击,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响 ...

  8. LeetCode OJ 116. Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  9. Pointers and Dynamic Allocation of Memory

    METHOD 1: Consider the case where we do not know the number of elements in each row at compile time, ...

随机推荐

  1. Xcode常用代码块

    Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便. 常用的: 1.strong:@property (nonatomic,stron ...

  2. Android之IPC机制

    Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...

  3. 二、JavaScript语言--事件处理--DOM事件探秘

    第一章 事件流 事件:是文档或浏览器窗口中发生的.特定的交互瞬间.JavaScript和HTML之间的交互都是通过事件来实现的. 事件流:描述的是从页面中接受事件的顺序 IE:事件冒泡流 Netsca ...

  4. lsof -ntP -i:端口取出 动行程序的PID 然后xargs kill -9 这个进程

    [root@ok ok]# lsof -ntP -i: [root@ok ok]# netstat -lnutp|grep tcp /dnsmasq tcp /sshd tcp ::: :::* LI ...

  5. Delphi函数参数传递 默认参数(传值)、var(穿址)、out(输出)、const(常数)四类

    Delphi的参数可以分为:默认参数(传值).var(传址).out(输出).const(常数)四类 可以对比C/C++的相关知识,类比学习. 1.默认参数是传值,不会被改变,例子 function ...

  6. LightOJ 1030 Discovering Gold(期望 概率)

    正推,到达i的概率为p[i],要注意除了1和n外,到达i的概率并不一定为1 概率表达式为p[i] += p[j] / min(n - j, 6) 从j带过来的期望为exp[i] += exp[j] / ...

  7. EasyUI - DataGrid 去右边空白滚动条列 分类: JavaScript 2014-09-03 10:46 1090人阅读 评论(2) 收藏

    熟悉 EasyUI - DataGrid 的童鞋应该会注意到这样一个情景: 想去掉这块,找了下资料,发现也有人同样纠结:http://www.cnblogs.com/hantianwei/p/3440 ...

  8. .NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  9. Android之Inflate()

      Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能.最近做的一个项目就是这一点让我迷茫了好几天. Android上还有一个与Inflate( ...

  10. T-SQL优化

    我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还 ...