嵌入式面试题 C语言常见面试题整理_3

本文详细讲解了C语言中的格式化输出,包括左右对齐与数字宽度的设定;介绍了运算符的优先级,特别是逗号运算符的使用;探讨了函数调用时的形参与实参概念,以及值传递和地址传递的区别;通过示例展示了静态变量的特性,包括隐藏、持久性和默认初始化为0;同时指出了错误的函数定义和参数传递方式。
摘要由CSDN通过智能技术生成

1.输出数据对齐问题

Printf(“%-6x”,x); 输出的数据是左对齐,没有加 - 是右对齐。

左对齐:

printf(“%d\n”,101010);  默认的方式是左对齐。

printf(“%-10d\n”,101010); 在打印数字宽度前面加一个“-”也是左对齐,10表示数字宽度为10,

如果打印的位数小于10,则后面补足空格,如果打印的位数大于10,则打印所有的数字,不会截断。

printf(“%10d”,101010); 在%和d之间加上数字宽度,就可以右对齐了,10表示数字宽度为10,

如果要打印的位数小于10,左边补足空格,如果打印的位数大于10,则打印所有的数字。

但是打印出来的效果是一样的。

2.复合语句注意点

#include "stdio.h"
int main(void)
{
	a = 30, b = 20, x;
	if(a > b)
	{
		x = a;
		printf("%d\n",a);
	}
	else
		x = b;
	    printf("%d\n",b);
	return 0;
}

程序的运行结果: 30  20

程序本来的目的是输出a,b两个数中较大的数并存入x中,但是却把两个数都输出了,错误的原因

在于else分支的两条语句该用{ }括起来,不能用上下对齐的方式来表示复合语句。

3.Int a=1, b=2, c=3; 以下语句中的执行效果与其他3个不同的是(C)

A  if(a>b)c=a,a=b,b=c;  
B if(a>b) {c=a,a=b,b=c;}
C  if(a>b)c=a;a=b;b=c; 
D if(a>b){c=a,a=b,b=c; }

逗号可以将两个表达式分开,形成一个表达式。而用;;分隔开的属于3个项目。

4.惰性计算方法

#include "stdio.h"
void main()
{
	int n = 2, k = 0;
	while(k++&&n++>2);
	printf("%d %d\n",k,n);
}

输出的正确答案是1  2

刚开始运算的时候,k的值是0,n的值是2,并还没有进行自增1的操作,自增1要在下一次循环中。

对于循环条件(k++&&n++>2),首先计算k,由于k的初值为0,k++是后坐,因此k++在参与比较

的时候是0(假),比较以后k值增1(变为1),这时,系统不会再计算&&后面的表达式了(即

所谓的惰性计算方法),所以,n++>2没有参与运算,也就是说,循环语句执行之后,k的值是1

n的值是2.

在a<b  &&  c < d; 中得保证a<b不等于0才会对c<d进行运算。 

5.运算符优先级问题

单目运算符优先级比双目运算符的高,在双目运算符中,算术运算符的优先级最高,

移位运算符次之,关系运算符再次之,最后是逻辑运算符。

 i = 0;
 while(i < n)
 y[i] = x[i++];

这个程序是不正确的,因为有时候可能在i自增之前被求值。

6.形参和实参

int gcd(int a, int b)    //函数定义

调用形式可以是gcd(x,y), 也可以是gcd(60,36);

函数定义中的a和b是形式参数,函数调用时x和y是实际参数,60和36也是实际参数。

实际参数是表达式,由于变量也构成一个表达式,实际参数也可以是变量,但是形式参数

只能是变量。

数据的传递是 单向的,只能是从实参向形参传递。

在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是  c

A. 地址传递  B. 由实参传给形参,再由形参返回实参  C. 值传递  D. 传递方式由用户指定

C++中以下关于函数调用的说法哪个是正确的?   D

A. 传地址后实参和形参指向不同的对象  B.传引用后实参和形参是不同的对象  
C.传值后对形参的修改会改变实参的值   D.其他三项都不对

7.函数间的传参

#include "stdio.h"

void swap_fail(int a,int b);

int main()
{
	int i,j;
	i = 2,j = 4;
	printf("调用前 i = %d, j=%d\n",i,j);
	swap_fail(i,j);
	printf("调用后 i = %d, j=%d\n",i,j);
	return 0;
}

void swap_fail(int x,int y)
{
	int temp;
	printf("交换前x=%d,y=%d\n",x,y);
	temp=x; x=y; y=temp;
	printf("交换后x=%d,y=%d\n",x,y);
}

运行结果:

调用前 i=2, j=4  交换前 x=2,y=4

交换后 x=4,y=2  调用后 i=2, j=4

本程序中函数swap_fail()不能 将两个数据进行交换,因为i和j作为实参只是将自己的值传给

形参x和y,i和j并没有因为形参的变化而变化。

传递的是地址:

#include "stdio.h"

void swap(int &a,int &b) 
{ 
   int temp;
   temp=a;
   a=b;
   b=temp;
   cout<<a<<’ ‘<<b<<’\n’;
} 

int main(){ 
 
   int x=1;
   int y=2;
   swap(x,y);
   cout<<x<<’ ‘<<y<<’\n’;
   return 0;

} 

输出结果:2   1   2   1

传递的是指针:

#include "stdio.h"

void foo(int *a, int *b)
{
  *a = *a + *b;
  *b = *a - *b;
  *a = *a - *b;
}

void main()
{
  int a = 1, b = 2, c = 3;
  foo(&a, &b);
  foo(&b, &c);
  foo(&c, &a);
  printf("%d, %d, %d", a, b, c);
}

输出结果:132

8.静态变量static

作用域:内部静态变量的作用域仅在定义它的函数和分程序中有效。

生存期:无论是静态变量还是外部变量都是永久的,即使程序退出函数的执行,该函数的

内部静态变量也任然不被系统调用。

static第一条特性:隐藏。

外部静态变量的作用域是在定义它的同一源文件中,同一源文件的各个函数可以共享该变量,

其他源文件不能访问。

static第二条特性:持久记忆性。

#include "stdio.h"
static int y=10;
int main()
{
	int i;
	void decr();
	for(i=1;i<=3;i++)
		decr();
	return 0;
}
void decr()
{
	static int x=10;
	x--;
	y--;
	printf("\n x=%d y=%d",x,y);
}

结果: x=9 y=9
            x=8 y=8
            x=7 y=7

dexr()函数中的x是内部静态变量,初始化后,内容为10,decr()函数每次被调用,x的值减1,

从decr()函数退出,该空间也不 释放,下一次进入decr函数时,原来的x值有效,但是尽管x

是有记忆的,但是作用域只局限于decr()函数内。

Static第三条特性:默认初始化为0.

C语言static关键字的作用(有三个作用)-CSDN博客

9.错误的函数定义

#include "stdio.h"
int function(x)  //错误的函数定义
{
	int x,y;    //形式参数不能写在函数内部
	y=3*x*x+2*x+1;
	return(y);
}

在这个例子中,x是函数的形式参数,y是函数内部使用的变量,但是,程序中将函数的形式参数

的类型定义在{ }里面,引起了错误。

10.函数调用的时候,参数不能带数据类型

#include "stdio.h"
int function(int x)
{
	int y;
	y=3*x*x+2*x+1;
	return(y);
}
int main()
{
	int x;
	printf("请输入一个整数");
	scanf("%d",&x);
	printf("x=%d f(x)=%d\n",x,function(int x));
	return 0;
}

printf("x=%d f(x)=%d\n",x,function(int x));  对函数function( )的调用方式是错误的,因为函数调用

的时候,参数是不带数据类型的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值