C语言面试题(基础概念)

有什么问题请评论,会及时修改,避免误导大家。

1、C语言是一种什么类型的编程语言?

答:C语言是一种通用的、结构化的、编译型的编程语言。

2、C语言中有哪些基本数据类型?

答:C语言中有以下基本数据类型:char(字符型)、int(整型)、float(单精度浮点型)、double(双精度浮点型)和void(空类型)。

3、C语言中如何定义一个变量?

答:C语言中定义一个变量的一般格式为:数据类型 变量名 [= 初始值];其中,数据类型指定了变量的存储大小和值的范围,变量名是变量的标识符,初始值是可选的,用于给变量赋予一个初始值。

4、C语言中如何定义一个常量?

答:C语言中定义一个常量有两种方式:

使用#define指令,格式为:#define 常量名 常量值;其中,常量名是一个标识符,常量值是一个字面值或表达式。

使用const关键字,格式为:const 数据类型 常量名 = 常量值;其中,const表示常量不可修改,数据类型和常量名与变量定义相同,常量值必须给出。

5、C语言中有哪些算术运算符?它们的优先级和结合性如何?

答:C语言中有以下算术运算符:

+(加法)、 -(减法)、 *(乘法)、 / (除法)、 % (取模)

它们的优先级从高到低依次为:

*/% +-

它们都是左结合的,即从左到右进行计算。

6、C语言中有哪些关系运算符?它们的优先级和结合性如何?

答:C语言中有以下关系运算符:

== (等于)、 != (不等于)、 >(大于)、 < (小于)、 >=(大于等于)、 <= (小于等于)

它们的优先级从高到低依次为:

< <= > >= == !=

它们都是左结合的,即从左到右进行计算。

7、C语言中有哪些逻辑运算符?它们的优先级和结合性如何?

答:C语言中有以下逻辑运算符:

! (逻辑非)、 && (逻辑与)、 || (逻辑或)

它们的优先级从高到低依次为:

! && ||

它们都是左结合的,即从左到右进行计算。

8、C语言中有哪些位运算符?它们的优先级和结合性如何?

答:C语言中有以下位运算符:

& (按位与)、 | (按位或)、 ^ (按位异或)、 ~ (按位取反)、 << (左移)、 >>(右移)

它们的优先级从高到低依次为:

~ << >> & ^ |

9、C语言中有哪些赋值运算符?它们的优先级和结合性如何?

答:C语言中有以下赋值运算符:

= (简单赋值)、 += (加法赋值)、 -= (减法赋值)、 *= (乘法赋值)、 /= (除法赋值)、 %= (取模赋值)、 &= (按位与赋值)、 |= (按位或赋值)、 ^= (按位异或赋值)、 <<= (左移赋值)、 = (右移赋值)

它们的优先级从高到低依次为:

= += -= *= /= %= &= |= ^= <<= >>

它们都是右结合的,即从右到左进行计算。

10、C语言中有哪些条件运算符?它们的优先级和结合性如何?

答:C语言中有以下条件运算符:

? : (三目运算符)

它的优先级低于所有其他运算符

11、C语言中有哪些逗号运算符?它们的优先级和结合性如何?

答:C语言中有以下逗号运算符:

, (逗号)

它的优先级最低

12、C语言中有哪些类型转换运算符?它们的优先级和结合性如何?

答:C语言中有以下类型转换运算符:

(类型) (强制类型转换)

它的优先级高于所有其他运算符,且是右结合的,即从右到左进行计算。

13、C语言中有哪些取地址和解引用运算符?

答:C语言中有以下取地址和解引用运算符:

& (取地址)

* (解引用)

14、C语言中有哪些自增和自减运算符?它们的优先级和结合性如何?

答:C语言中有以下自增和自减运算符:

++ (自增)、 -- (自减)

它们可以作为前缀或后缀使用,前缀时表示先改变变量的值再使用,后缀时表示先使用变量的值再改变。它们的优先级是右结合的,即从右到左进行计算。

15、C语言中有哪些运算符的优先级和结合性与C++不同?

答:C语言中有以下运算符的优先级和结合性与C++不同:

& (按位与)和&& (逻辑与)在C语言中是同一优先级,而在C++中是不同优先级。

| (按位或)和|| (逻辑或)在C语言中是同一优先级,而在C++中是不同优先级。

?: (三目运算符)在C语言中是右结合的,而在C++中是左结合的。

16、C语言中如何表示一个表达式的值?

答:C语言中表示一个表达式的值有两种方式:

使用printf函数,格式为:printf(“%格式符”, 表达式);其中,格式符指定了表达式的数据类型和输出格式,例如%d表示十进制整数,%f表示浮点数等。

使用赋值运算符,格式为:变量 = 表达式;其中,变量必须与表达式的数据类型相同或兼容。

17、C语言中如何输入一个表达式的值?

答:C语言中输入一个表达式的值有两种方式:

使用scanf函数,格式为:scanf(“%格式符”, &变量);其中,格式符指定了变量的数据类型和输入格式,例如%d表示十进制整数,%f表示浮点数等。&变量表示取变量的地址作为参数传递给scanf函数。

使用赋值运算符,格式为:变量 = 表达式;其中,表达式可以是一个常量、一个函数调用或者其他形式。

18、请写出下面程序的输出结果,并解释原因。

#include <stdio.h>
int main()
{
    int a[10] = {10,11,12};
    int *p = a;
    printf("%d\n", *p++);
    printf("%d\n", (*p)++);
    printf("%d\n", *p);
    return 0;
}

程序的输出结果是:

10
11
12

解析:

*p++表示先取出p指向的值,然后将p加1,指向下一个地址。所以第一次输出的是a[0],值是10。

(*p)++表示先取出p指向的值,然后将这个值加1;但后缀++是先用后加,所以第二次输出的是a[1]加的值11。

*p表示取出p指向的值。由于前面两次操作都改变了指针指向,p指针指向到a[2]了,所以第三次输出的是a[3],值是12。

19、请写出下面程序的输出结果,并解释原因。

#include <stdio.h>
struct student
{
    char name[20];
    int age;
};
int main()
{
    struct student s1 = {"Tom", 18};
    struct student s2 = s1;
    s2.age = 20;
    printf("%s %d\n", s1.name, s1.age);
    printf("%s %d\n", s2.name, s2.age);
    return 0;
}

程序的输出结果是:

Tom 18
Tom 20

解析:结构体赋值时,会将所有成员变量逐个复制给另一个结构体变量。所以s2和s1有相同的name和age。

修改s2.age并不会影响s1.age,因为它们是不同的变量。所以s1.age仍然是18,而s2.age变成了20。

20、下面哪些语句是正确的,哪些是错误的?请说明理由。

a) char * const p;

b) char const *p;

c) const char *p;

d) char const* const p;

a) 正确;表示一个常量指针,指向char类型数据,p不可更改。 b) 正确;表示一个指针,指向const char类型数据,p可更改,但p指向的数据不可更改。 c) 正确;与b)等价。 d) 正确;表示一个常量指针,指向const char类型数据,p和p指向的数据都不可更改。

21、下面程序中,如何修改fun函数的参数和返回值类型,使得main函数能够正确输出x和y的值?

#include<stdio.h>
void fun(?, ?)
{
   //交换x和y的值
}
int main()
{
   int x = 10, y = 20;
   fun(?, ?);
   printf("x=%d y=%d\n", x, y);
   return 0;
}

解答:

修改fun函数如下:

void fun(int *x, int *y)
{
   int temp = *x;
   *x = *y;
   *y = temp;
}

修改main函数如下:

int main()
{
   int x = 10, y = 20;
   fun(&x, &y);
   printf("x=%d y=%d\n", x, y);
   return 0;
}

解析:

要交换两个变量的值,需要传递它们的地址给fun函数,并用指针操作它们。

在main函数中调用fun函数时,需要用&符号取得x和y的地址,并传递给fun函数。

22、下面程序中,如何修改while循环的条件,使得能够输出从1到100之间所有能被3整除但不能被5整除的数?

#include<stdio.h>
int main()
{
   int i = 1;
   while(?)
   {
      if(?)
      {
         printf("%d ", i);
      }
      i++;
   }
   return0;
}

解答:

修改while循环如下:

while(i <= 100)
{
   if(i % 3 == 0 && i % 5 != 0)
   {
      printf("%d ", i);
   }
   i++;
}

解析:

要输出从1到100之间所有能被3整除但不能被5整除的数,需要判断i是否满足这个条件。

判断i是否能被3整除可以用i % 3 == 0(求余运算),判断i是否不能被5整除可以用i % 5 != 0(求余运算)。

将两个条件用&&(逻辑与)连接起来,并放在if语句中执行输出操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值