一.关于sizeof( ):

1.sizeof( )是C语言的一种单目操作符,而不是函数。C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义。

  1. int i=0;
  2. long long t = sizeof(i++);
  3. printf(“%d”, i);

答案是0;

2.sizeof与strlen的区别

这个东西最直观的就是一个是函数,一个是运算符,然后是一个两个的参数不同;

  • 以下摘自程序员面试宝典,看看就好,直接跳过也行

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
sizeof还可以用函数做参数,比如:

  1. short f();
  2. printf(“%d\n”,sizeof(f()));

输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

  1. charstr[20]=“0123456789”;
  2. int a=strlen(str);//a=10;
  3. int b=sizeof(str);//而b=20;

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去

  1. fun(unsiged char*p1, int len)
  2. {
  3. unsigned char* buf= new unsigned char[len+1]
  4. memcpy(buf, p1,len);
  5. }

二.C语言关键词

C语言的关键字共有32个,这些关键词都是不能被定义成变量的。所以,题目里面,如果给你的程序里有int if;果断选择不能通过编译。

根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

1 数据类型关键字(12个):
(1) char :声明字符型变量或函数
(2) double :声明双精度变量或函数
(3) enum :声明枚举类型
(4) float:声明浮点型变量或函数
(5) int: 声明整型变量或函数
(6) long :声明长整型变量或函数
(7) short :声明短整型变量或函数
(8) signed:声明有符号类型变量或函数
(9) struct:声明结构体变量或函数
(10) union:声明共用体(联合)数据类型
(11) unsigned:声明无符号类型变量或函数
(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

2控制语句关键字(12个):
A循环语句
(1) for:一种循环语句(可意会不可言传)
(2) do :循环语句的循环体
(3) while :循环语句的循环条件
(4) break:跳出当前循环
(5) continue:结束当前循环,开始下一轮循环
B条件语句
(1)if: 条件语句
(2)else :条件语句否定分支(与 if 连用)
(3)goto:无条件跳转语句
C开关语句
(1)switch :用于开关语句
(2)case:开关语句分支
(3)default:开关语句中的“其他”分支
D返回语句
return :子程序返回语句(可以带参数,也看不带参数)

3 存储类型关键字(4个)
(1)auto :声明自动变量 一般不使用
(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)
(3)register:声明积存器变量
(4)static :声明静态变量

4 其它关键字(4个):
(1)const :声明只读变量
(2)sizeof:计算数据类型长度
(3)typedef:用以给数据类型取别名(当然还有其他作用
(4)volatile:说明变量在程序执行中可被隐含地改变

三.逻辑运算符的短路问题

逻辑运算符是自左向右进行的,如果左边的结果已经决定结果了,就不会做右边的运算。

例题:

判断:若a=1,b=2则执行a=!a&&b++;后b的值是3

答案:错

四.if – else语句

这里有个坑,就是if语句可以单独存在,但是else语句就一定要找到配对的if

例题:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int i=6;
  5.     if ( i<= 6 )
  6.         printf(“hello\n”);;
  7.     else
  8.         printf(“bye-bye\n”);;
  9. }

注意看if语句这玩意后面有两个分号,所以如果你把这个放到编译器里面编译,就会出现[Error] ‘else’ without a previous ‘if’

五.char的水平转换

例题:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     char ch = -1;
  5.     printf(“%d\n%c”, ch,ch);
  6. }

答案是-1
然后?然后就没有然后了。因为-1在ASCII码表中没有字符,自然就不输出。而char其实是以一个整型储存的,所以输出的是-1。

番外篇:今天讲水平方向的自动类型转换

我很疑惑为什么long 自动转换成unsigned long,因为如果一个long定义的变量是负数,那么变成unsigned long不是会正吗?然而,我试了下,发现并没有。。。于是请教了下yh。

我的理解就是,unsigned定义的变量其实并不改变数值在计算机中的储存的二进制码,但是为什么unsigned可以让变量范围扩大,并且全部是正的呢?这就和原码补码反码有关,当使用unsigned的时候,不改变计算机内部数值的二进制,但是当你要输出的时候,计算机会用他的方法选择把那个东西看作是原码还是反码或者补码,并且以此来让你看到正数或者负数。