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语言中的符号总结的更多相关文章

  1. 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

    原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; i ...

  2. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

  3. C语言中 有符号数、无符号数、整数溢出 (转)

    #include<stdio.h> void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } ...

  4. C语言中的符号重载

    摘自<C专家编程>第二章37页                     C语言中符号的重载 符号 意义 static 在函数内部,表示该变量的值在各个调用间一直保持延续性在函数这一级,表示 ...

  5. c/c++排坑(2) -- c语言中的符号重载

    所谓的符号重载就是在不同的上下文环境里有不同的意义.甚至有些关键字也被重载而具有好几种意义,这也是C语言的作用域规则对程序员不那么清晰的主要原因. 本章内容摘自<c专家编程>P37. 大家 ...

  6. C语言中的 @ 符号是什么意思?

    Global Variable Address Modifier (@address)You can assign global variables to specific addresses wit ...

  7. 【转】C语言中的符号优先级

    转自: http://blog.csdn.net/huangblog/article/details/8271791 虽然在日常使用中,添加括号来明确规定运算符优先级是一种常识,但毕竟学校考试就喜欢考 ...

  8. C语言中无符号与有符号问题

    unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a ...

  9. C语言中的强符号与弱符号

    转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...

随机推荐

  1. 两种最常用的 HTTP 方法:GET 和 POST。

    什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的请求-应答协议. web 浏览器可能是客户端,而计算机上的网络应用程 ...

  2. KiCad 5.1.0 镜像圆弧后错位问题

    KiCad 5.1.0 镜像圆弧后错位问题 看官方回复这个问题将在 5.1.3 进行修复,因为这段时间在举行 KiCon 活动. 看到这个问题并不是非常严重,不是致命的,所以已经从 5.1.0 跳到 ...

  3. React全家桶打造共享单车后台管理系统项目_第1篇_项目环境搭建_首页编写

    1.项目介绍 项目github地址:https://github.com/replaceroot/React-manageSystem  项目整体架构: 课程大纲:     第一章:React基础知识 ...

  4. mysql数据库之工作流程

    MySQL架构总共四层,在上图中以虚线作为划分. 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构.比如:连接处理.授权认证.安全等. 第二层的架构 ...

  5. 洛谷P1546 最短网络 Agri-Net(Prim堆优化)

    #include<bits/stdc++.h> using namespace std; ; const int INF=0x3f3f3f3f; inline void read(int ...

  6. 洛谷P2820 局域网

    #include<bits/stdc++.h> using namespace std; ; ; int n,k,sum,tot; struct node{ int cnt,fa; }f[ ...

  7. Java发送邮件的工具类

    package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  8. 模板—堆优化dijkstra

    ];]; void dijkstra(int s) { memset(dis,0x7f,sizeof(dis));ma(v); priority_queue<pair<int,int> ...

  9. 20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }

    写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数 ...

  10. 使用jquery.form.js的ajaxsubmit方法提交数据的Bug

    周五同事遇到一个很奇怪的问题,调到下班,虽然问题解决了,但是不知道问题的具体原因,回来翻了翻代码,才发现症结所在,下面就分享出来,供遇到同样问题的同行们参考: 先把问题描述一下,做的功能是使用ajax ...