C语言中的符号总结

1、注释符号                     //和/* ...*/

2、续行符号                     \

3、转义符号                    常用:\r 和 \n 等

4、单引号      ‘     括起来的一个字符代表整数

5、双引号      “     括起来的字符代表一个指针

单引号 ‘ 括起来的一个字符代表整数,双引号 “ 括起来的字符代表一个指针。所以虽然C编译器接受字符和字符串的比较,可意义是错误的,C编译器允许字符串对字符变量赋值,其意义是可笑的。

6、逻辑运算符:&&    ||    !

  (1)逻辑与 && 和逻辑或 || 在程序中的短路规则:

  && 从左向右开始计算,当遇到为假的条件时停止计算,整个表达式为假,所有条件为真时表达式才为真。

   ||  从左向右开始计算,当遇到为真的条件时停止计算,整个表达式为真,所有条件为假时表达式才为假。

  经典案例,如下所示,打印结果为1,0。如果将第六行改为 if(++i>0 && ++j>0)打印结果1,1。

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int i = 0;
 5     int j = 0;
 6     if( ++i > 0 || ++j > 0 )
 7     {
 8         printf("%d\n", i);
 9         printf("%d\n", j);
10     }
11     return 0;
12 }

  (2)逻辑非

  !0 = 1      !1 = 0      !100 = 0      !-1000 = 0

7、三目运算符         (a?b:c)

  (1)三目运算符可以看做是逻辑运算符的载体

  (2)规则:当a为真的时候,返回b的值,否则,返回c的值。

8、位运算符            &      |      ^      ~      <<      >>

  按位与,按位或,按位异或,按位取反,左移,右移是位运算中常用的符号。

  左移:高位丢弃,低位补0。

  右移:低位丢弃,高位补符号位。(注意高位不是补0)

 1 void test(void)
 2 {
 3     int a=-8;
 4     a=a>>3;
 5     printf("%d\n",a);    //结果:-1
 6 }
 7 void test1(void)
 8 {
 9     int a=8;
10     a=a>>3;
11     printf("%d\n",a);    //结果:1
12 }  

  小技巧:左移n位相当于乘以2的n次方,但效率比数学运算符高。右移n位相当于除以2的n次方,但效率比数学运算符高。

  异或:异或是一个很强大的符号,之前交换两个数的位置就见识到了。此外,异或满足交换律和结合律,具体实例见如下面试题。

  面试题:有一个数列,其中的自然数的个数都是以偶数的形式出现,只有一个自然数出现的次数为奇数次,编写程序找出这个自然数。

  算法1:遍历数组,找单数。这种方法是最容易考虑到的的方法,但是耗时间也耗空间。

  算法2:针对异或满足交换律和结合律,用异或的方法,既省时间,又省空间。代码如下,宏 DIM(a) 用来计算数组长度,其中 sizeof(a) 表示 a数组占的字节数,sizeof(*a) 就是相当于a[0]占的字节数。

 1 #include <stdio.h>
 2 #define DIM(a) (sizeof(a)/sizeof(*a))
 3 int main()
 4 {
 5     int str[] = {2,3,5,7,2,2,2,5,3,7,1,1,1};
 6     int find =0;
 7     int i=0;
 8     for(i=0;i<DIM(str) ;i++)
 9     {
10         find = find^str[i];
11     }
12     printf("%d\n",find);
13     return 0;
14 }

9、++    --

  表达式 ++ 和 -- 的阅读技巧,贪心法:从左到右尽可能多的包含字符。因为编译器是从左向右的顺序一个一个的尽可能多的读入字符,一直到即将读入的字符不可能和已读入的字符组成合法符号为止。

 1 #include <stdio.h>
 2 void test(void);
 3 void test2(void);
 4 void test3(void);
 5 void test4(void);    //补充:逗号运算符
 6 int main()
 7 {
 8     test();
 9     return 0;
10 }
11
12 /************************************************************************
13 C语言的灰色地带,由编译器决定,如果先算括号,那就是6+6+6=18;
14 如果前面两次加之后,在+(++i),结果就是16--本编译器(Dev-C++)就是这样弄的
15 ************************************************************************/
16 void test(void)
17 {
18     int i=3,j;
19     j=(++i) + (++i) +(++i);
20     printf("%d\n",j);   //结果为16
21 }
22
23 #if 0
24 //将test中的 j=(++i) + (++i) +(++i);括号去掉分析--报错
25 void test2(void)
26 {
27     int i=0,j;
28     j = ++i+++i+++i;
29     //分析--贪心法:从左到右尽可能多的包含字符: 前面一部分等价于:(++i)++ 相当于1++,一个数值++,就会报错 。
30     //用 j=++i++;和1++;编译出错的结果是一样的,所以这样理解是对的。
31
32     printf("%d\n",j);
33 }
34 #endif
35
36 void test3(void)
37 {
38     int a=1;
39     int b=1;
40     int c;
41     c=a+++b;   //贪心法
42     printf("%d\n",a);   //结果为2
43     printf("%d\n",c);   //结果为2
44 }
45
46 //逗号运算符规则,从左到右顺序求值,最后一个表达式的值就是逗号表达式的值。
47 void test4(void)
48 {
49     int x;
50     int i=3;
51     x=(++i,i++,i+10);
52     printf("%d\n",x);   //结果为15
53 }
时间: 2024-10-09 13:44:07

C语言中的符号总结的相关文章

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

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; } 答案是:>6 第二题 #include<stdio.h> int m

C语言中的符号重载

C语言中的符号重载(C专家编程,2.3误做之过,P37) 符号 意义 static 在函数内部,表示该变量的值在各个调用间一直保持延续性 在函数这一级,表示该函数只对本文件可见 extern 用于函数定义,表示全局可见(属于冗余) 用于变量,表示它在其他地方定义 void 作为函数的返回类型,表示不返回任何值 在指针声明中,表示通用指针的类型 位于参数列表中,表示没有参数 * 乘法运算符 用于指针,间接引用 在声明中,表示指针 & 位的AND操作符 取地址操作符 = 赋值符 == 比较运算符 &l

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

[cpp] view plain copy print? #include<stdio.h> void main() { int l=-1; unsigned int c=135; printf("%u\n",l+c); } 这个的结果134,而不是我之前认为的很大的正数,实际上需要注意的是-1(0xffffffff)被提升为unsigned int后是一个差1就溢出的unsigned int,所以相加后结果是134.但是如果l=-10000,那么结果就真是一个很大的正数了

c语言中无符号和有符号之间的运算

关于计算机中有符号,无符号数值的表示以及它们之间的运算 是基本知识,但工作这么多年也不敢说完全搞明白透彻. 这几天在将知识点进行了一些梳理,并做了一些有意思的试验. 计算机中,数值的表示和运算都是用补码表示的. 正数的补码就是其本身: 负数的补码则是最高符号位为1,其余位取反加1. 比如-5表示为0xFFFB, 而5则表示为0x0005. 这里,第一个需要注意的问题就是 有符号数和无符号数之间的运算. c语言规定,先一律转成无符号数,然后再进行运算. 比如,  int iValue1 = -5;

C语言中的运算符号

C语言中的符号--具体用法问度娘 运算符的种类 语言的运算符可分为以下几类: 1 算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(--)共七种. 2.关系运算符 用于比较运算.包括大于(>).小于(<).等于(==). 大于等于(>=) .小于等于(<=)和不等于(!=)六种. 3.逻辑运算符 用于逻辑运算.包括与(&&).或(||).非(!)三种. 4.位操作运算符 参与运算的量,按二进制位进行

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑

深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言中的有符号数和无符号数 上一篇博客我们给出了C语言中在32位机器和64位机器中支持的整型类型数据,我们这里只给出32位机器上的: 尽管 C 语言标准没有指定有符号数要采用某种编码表示,但是几乎所有的机器都使用补码.通常大多数数字是默认有符号的,比如当声明一个像12345或者0xABC这样的常量的时候

C语言引用连接脚本lds中的符号——清除bss段,c实现方式

之前我们的启动文件清除bss和拷贝都是通过汇编的方式的实现,但是,我们能够使用C语言,就不使用汇编: 先看连接脚本: SECTIONS { . = 0x30000000; __code_start = .; . = ALIGN(4); .text : { *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); __bss_start = .; .bss :

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

注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么