C语言中的符号总结
1、注释符号 //和/* ...*/
2、续行符号 \
3、转义符号 常用:\r 和 \n 等
4、单引号 ‘ 括起来的一个字符代表整数
5、双引号 “ 括起来的字符代表一个指针
单引号 ‘ 括起来的一个字符代表整数,双引号 “ 括起来的字符代表一个指针。所以虽然C编译器接受字符和字符串的比较,可意义是错误的,C编译器允许字符串对字符变量赋值,其意义是可笑的。
6、逻辑运算符:&& || !
(1)逻辑与 && 和逻辑或 || 在程序中的短路规则:
&& 从左向右开始计算,当遇到为假的条件时停止计算,整个表达式为假,所有条件为真时表达式才为真。
|| 从左向右开始计算,当遇到为真的条件时停止计算,整个表达式为真,所有条件为假时表达式才为假。
经典案例,如下所示,打印结果为1,0。如果将第六行改为 if(++i>0 && ++j>0)打印结果1,1。
#include <stdio.h> int main() { ; ; || ++j > ) { printf("%d\n", i); printf("%d\n", j); } ; }
(2)逻辑非
!0 = 1 !1 = 0 !100 = 0 !-1000 = 0
7、三目运算符 (a?b:c)
(1)三目运算符可以看做是逻辑运算符的载体
(2)规则:当a为真的时候,返回b的值,否则,返回c的值。
8、位运算符 & | ^ ~ << >>
按位与,按位或,按位异或,按位取反,左移,右移是位运算中常用的符号。
左移:高位丢弃,低位补0。
右移:低位丢弃,高位补符号位。(注意高位不是补0)
void test(void) { ; a=a>>; printf("%d\n",a); //结果:-1 } void test1(void) { ; a=a>>; printf("%d\n",a); //结果:1 }
小技巧:左移n位相当于乘以2的n次方,但效率比数学运算符高。右移n位相当于除以2的n次方,但效率比数学运算符高。
异或:异或是一个很强大的符号,之前交换两个数的位置就见识到了。此外,异或满足交换律和结合律,具体实例见如下面试题。
面试题:有一个数列,其中的自然数的个数都是以偶数的形式出现,只有一个自然数出现的次数为奇数次,编写程序找出这个自然数。
算法1:遍历数组,找单数。这种方法是最容易考虑到的的方法,但是耗时间也耗空间。
算法2:针对异或满足交换律和结合律,用异或的方法,既省时间,又省空间。代码如下,宏 DIM(a) 用来计算数组长度,其中 sizeof(a) 表示 a数组占的字节数,sizeof(*a) 就是相当于a[0]占的字节数。
#include <stdio.h> #define DIM(a) (sizeof(a)/sizeof(*a)) int main() { ,,,,,,,,,,,,}; ; ; ;i<DIM(str) ;i++) { find = find^str[i]; } printf("%d\n",find); ; }
9、++ --
表达式 ++ 和 -- 的阅读技巧,贪心法:从左到右尽可能多的包含字符。因为编译器是从左向右的顺序一个一个的尽可能多的读入字符,一直到即将读入的字符不可能和已读入的字符组成合法符号为止。
#include <stdio.h> void test(void); void test2(void); void test3(void); void test4(void); //补充:逗号运算符 int main() { test(); ; } /************************************************************************ C语言的灰色地带,由编译器决定,如果先算括号,那就是6+6+6=18; 如果前面两次加之后,在+(++i),结果就是16--本编译器(Dev-C++)就是这样弄的 ************************************************************************/ void test(void) { ,j; j=(++i) + (++i) +(++i); printf("%d\n",j); //结果为16 } #if 0 //将test中的 j=(++i) + (++i) +(++i);括号去掉分析--报错 void test2(void) { ,j; j = ++i+++i+++i; //分析--贪心法:从左到右尽可能多的包含字符: 前面一部分等价于:(++i)++ 相当于1++,一个数值++,就会报错 。 //用 j=++i++;和1++;编译出错的结果是一样的,所以这样理解是对的。 printf("%d\n",j); } #endif void test3(void) { ; ; int c; c=a+++b; //贪心法 printf("%d\n",a); //结果为2 printf("%d\n",c); //结果为2 } //逗号运算符规则,从左到右顺序求值,最后一个表达式的值就是逗号表达式的值。 void test4(void) { int x; ; x=(++i,i++,i+); printf("%d\n",x); //结果为15 }
10、##,#@,#
(1)## 连接符号
用法例举:#define Connect(x,y) x##y
int val = Connect(0x12,45); / /结果就是val =1245;
char* str = Connect("abcd","efg"); / /结果就是 str = "abcdefg"
在C编译器(比如Cfree,DevC++都无法编译运行),但是在KeilC51可以正常运行使用。
(2)#@ 给字符加单引号
用法例举:#define ToChar(x) #@x
char a = ToChar(1); 结果就是 a='1';
在C编译器(比如Cfree,DevC++)和KeilC51都无法编译通过。
(3)# 给字符串加双引号
用法例举:#define ToString(x) #x
char* str = ToString(Hello); 结果就是 str="Hello";
在C编译器(比如Cfree,DevC++)和KeilC51可以正常运行使用。
11、
C语言中的符号总结的更多相关文章
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; i ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
- C语言中 有符号数、无符号数、整数溢出 (转)
#include<stdio.h> void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } ...
- C语言中的符号重载
摘自<C专家编程>第二章37页 C语言中符号的重载 符号 意义 static 在函数内部,表示该变量的值在各个调用间一直保持延续性在函数这一级,表示 ...
- c/c++排坑(2) -- c语言中的符号重载
所谓的符号重载就是在不同的上下文环境里有不同的意义.甚至有些关键字也被重载而具有好几种意义,这也是C语言的作用域规则对程序员不那么清晰的主要原因. 本章内容摘自<c专家编程>P37. 大家 ...
- C语言中的 @ 符号是什么意思?
Global Variable Address Modifier (@address)You can assign global variables to specific addresses wit ...
- 【转】C语言中的符号优先级
转自: http://blog.csdn.net/huangblog/article/details/8271791 虽然在日常使用中,添加括号来明确规定运算符优先级是一种常识,但毕竟学校考试就喜欢考 ...
- C语言中无符号与有符号问题
unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
随机推荐
- navicat 导入SQL文件出错
1.新建数据库 在数据库名或者表名上右键 运行SQL语句 2.去掉对勾 F5刷新则可以发现导入的表.
- js中的超过16位数字相加问题
方案一 function sub(str1, str2) { // 补全0,并多补一位0 let arr1 = null, arr2 = null if (str1.length > str2. ...
- DOTA轮播
原文:DOTA轮播 本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看. 这一节介绍一下Dota轮播,先看看最终效果图. 一.HTML代码分析: &l ...
- Java练习 SDUT-1255_小明A+B
小明A+B Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, ...
- QT 建立信号和槽的联系(事件处理)
Qt中事件处理机制叫做“信号”和“槽”signal &slot. 其模型为: 对象a中有一个信号signal:XXX(代表一个事件) 对象b中有一个槽slot:YYY(事件处理函数) 用con ...
- Android TextView点击效果
在Android开发中,我们有时候需要单独的点击某一段文本,如图所示: 如上图,我们要求点击新用户注册这个TextView,为了有更好的用户体验,我们肯定要设置该TextView的点击效果.下面介绍如 ...
- SuperSocket 扩展你的 Logger
SuperSocket 允许你自定义你的 Logger. 例如,你如果想要把你的业务操作日志保存到一个独立的地方,你仅需要在log4net配置文件中添加一个新的 logger 并为这个 logger ...
- js读取cookie 根据cookie名称获取值、赋值
借鉴:原作者https://blog.csdn.net/zouxuhang/article/details/80548417 //方法1 //存在问题:如果cookie中存在 aaaname= ...
- SELinux: Could not downgrade policy file
在配置nfs服务器,设定selinux时,碰到了SELinux: Could not downgrade policy file的错误提示,下文是其解决方案. 一.故障现象 [root@system1 ...
- POJ 1321 深搜dfs
思路其实挺简单的,为什么我想不到呢!!! 原因分析:(1)题目还是做少了 (2)做题目的时候在放音乐 (3)最近脑袋都不愿意想思路总是想一些无用的 改进:(1)以后做题目坚决不开音乐,QQ直接挂隐身 ...