C/C++面试准备——运算符
关于运算符
C语言中得运算符按运算类型分为:赋值运算符、算术运算符、逻辑运算符、关系运算符、位运算符、指针运算符和取成员运算符;
按运算对象(操作数)的个数分为:单目运算符、双目运算符、三目运算符。
题(1):请写出下列代码的输出内容。
考察内容自增量、自减量。
增量操作有前增量和后增量:前增量先加1,再将加1后的值作为表达式的值;后增量先将原数值作为表达式的值,再将原数加1。 自减量亦是如此。
#include<stdio.h>
int main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
//b,c,d:10,12,120
题(2):运算符的优先级问题
运算符的两个重要特性:优先级和结合性(计算顺序)。
#include<stdio.h>
int main()
{
if(0 & 1 ==0)
{
printf("0 & 1 ==0\n");//==和!=运算优先级高于&、~、|、&&、||
}
else{
printf("0 & 1 !=0\n");
}
if(0 & 1 !=0)
{
printf("0 & 1 !=0\n");
}
else{
printf("0 & 1 ==0\n");
}
//运算结果
//0 & 1!=0;
//0 & 1==0;
题(3):&&和&,||和| 有什么区别。
(1)&作为一元运算符,用来返回被操作数的地址;
作为二元运算符,为整型和bool型数据定义了二进制“与”运算:
当操作数为整型数据时,&是计算操作数的按位“与”;当操作数为bool型数据时,&是计算操作数的逻辑“与”运算,当且当两个操作数都为true时,其计算结果才为true。
(2)&&是二元运算符,对操作数进行条件“与”运算。将操作数视为真或假。在判断左侧操作数就能确定结果的情况下不再对右侧操作数求值。
(3)&和&&的区别:
一:&对操作数进行求值运算,&&只是判断逻辑关系。
二:&&在判断左侧操作数就能确定结果的情况下就不再对右侧操作数求值
|和||的区别亦是如此。
#include<stdio.h>
int main()
{
int a=8;
int b=9;
int c=0;
int d=0;
c=(a & b);
d=(a & b);
printf("c:%d\nd:%d\n",c,d);
}
//c:8
//d:1
题(3):什么是左值,什么是右值?
对于每一个变量,都有两个相关值:地址值和数据值。
地址值:存储在内存地址中的数据,也称为变量的右值。
数据值:存储数据值的那块内存的地址,也称为变量的左值。
左值可以做右值,右值不能做左值!!!
题(4):写出下面程序的运行结果。
(1)字符型数据在计算机内存中只占一个字节的空间。
(2)int/float在32/64位机上都是4个字节。(短整型是2个)
(3)double/long long在32/64上都是8个字节。
(4)unsigned long/long在32/64上都是8个字节。
(5)指针保存的是一个地址,其长度和整型数据一致。也就是说无论指针存储的地址指向哪一种数据类型的地址,其长度都是一个整型数据的长度。
#include<stdio.h>
#include<windows.h>
int main()
{
char x='a';
char *p="abcd";
char y[4]={'a','b','c','d'};
int a=10;
int *b=&a;
int c[4]={1,2,3,4};
printf("%d,%d,%d\n",sizeof(x),sizeof(p),sizeof(y));
printf("%d,%d,%d\n",sizeof(a),sizeof(b),sizeof(c));
}
//32
/*
1,4,4
4,4,16
*/
//64
/*
1,4,4
4,4,16
*/
题(5):sizeof和strlen的区别。
两者都是用来返回参数的长度。只不过sizeof用来返回一个数据类型的长度,strlen用来返回一个字符串的长度。
两者的本质区别:
(1)sizeof是一个操作符,strlen是一个函数。
(2)sizeof的参数可以是数据的类型,也可以是变量(此时可以不加括号);strlen只能以char *并且结尾为‘\0’的字符串作为参数。
#include<stdio.h>
#include<string.h>
int main()
{
int a=3;
printf("%d,%d",sizeof(int),sizeof(a));
char *p="hello 123!";
printf("%d",strlen(p));
}
//4,4
//10
(3)在大部分的编译器中,在编译时就计算出了sizeof的结果。strlen必须在运行时才能计算出来。sizeof计算所占内存大小,strlen计算字符串实际的长度。
#include<stdio.h>
#include<string.h>
int main()
{
char str[10]="abcd";//str数组在编译期就已经确定大小
int x=strlen(str);//在运行期确定
int y=sizeof(str);//在编译期期确定
printf("%d,%d",x,y);
}
//4,10
(4)数组做sizeof的参数不退化,传递给strlen就会退化为指针。
数组作为参数传给函数时,传递的是指向数组首地址的指针,不是数组数据结构。