本文概述
Q.1写下最小的可执行代码?
回答: main是执行代码所必需的。代码是
C
void main()
{
}
输出如下:
Q.2什么是入口控制和出口控制回路?
回答: C仅支持2个循环:
- 进入控制:此循环分为两部分
a。 while循环
b。 for循环 - 退出控制:在此类别中, 有一种类型的循环称为
a。do while循环。
Q.3为什么预处理器指令最后没有分号?
回答:编译器需要分号,顾名思义,预处理器是在编译前处理源代码的程序。因此分号不是必需的。
Q.4包含带有尖括号<>的头文件和双引号""之间的区别是什么?
回答:如果<>中包含头文件, 则编译器仅在内置包含路径中搜索特定的头文件。如果""中包含头文件, 则编译器将首先在当前工作目录中搜索特定的头文件, 如果找不到, 则在内置include路径中搜索。
Q.5近, 远和巨大指针有什么区别?
回答:这些是MS DOS时代在16位Intel体系结构中使用的一些旧概念, 不再有用。
近指针用于在16位计算机上的当前段中存储16位地址的手段。限制是我们一次只能访问64kb的数据。
一种远指针通常为32位, 可以访问当前段外部的内存。要使用此功能, 编译器会分配一个段寄存器来存储段地址, 然后分配另一个寄存器来存储当前段内的偏移量。
巨大的指针通常也是32位, 并且可以访问外部网段。对于远指针, 段是固定的。在远指针中, 段部分无法修改, 但在"巨大"中可以修改
近指针 | 远指针 |
---|---|
它的大小是2个字节 | 它的大小是4个字节 |
它们的地址在0-65535之间(即在用户区中) | 他们的地址超过65535(即超出用户区域) |
例如: 简单的指针, 我们通常在C和C ++中进行研究 |
设备中使用的指针, 正在运行程序, 即通过此远指针攻击其他计算机。 |
Q.6为什么不存在"类型降级"而不是"类型提升"?而且, 与通过类型提升进行操作相比, 它将消耗更少的空间资源。
回答:让我们以一个例子来理解它。
double a = 1.5; int b = 10并且我们要计算a + b
通过降级类型, 浮点类型a将转换为int。因此, a = 1和a + b = 1 + 10 = 11, 但是我们知道正确答案是11.5, 这只能通过类型提升获得。因此, 结论是通过类型降级, 我们将无法获得正确的答案。
Q.7什么是栈区和堆区?
- 堆区:它用于动态分配的对象(使用malloc()和calloc())。
- 栈区:它用于存储方法的局部变量和参数。它仅在该特定方法终止之前一直保留在内存中。
请参考栈与堆内存有关详细信息。
Q.8 C中的#include和Java中的import之间的区别?
回答:
#include | import |
---|---|
#include是不是关键字的语句。 |
而import是一个关键字。 |
它由预处理器软件处理。 | 它由编译器处理。 |
它增加了代码的大小。 | 它不会增加代码的大小。在这里, 即使我们写 导入java.lang。*; 它不会附加所有课程。而是将授予访问java.lang类的权限 |
Q.9 ++ * p, * p ++和* ++ p之间的区别?
1)前缀++和*的优先级相同。两者的关联性是从右到左。
2)后缀++的优先级高于*和前缀++。后缀++的关联性从左到右。
表达式++*p有两个相同优先级的操作符,因此编译器寻找结合性。运算符的结合性是从右到左的。因此,表达式被视为++(*p)。因此,第一个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 11”。
表达式*p++被视为*(p++),因为后缀++的优先级高于*。因此第二个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 20”。
表达式*++p有两个相同优先级的操作符,因此编译器寻找结合性。运算符的结合性是从右到左的。因此,表达式被视为*(++p)。因此第三个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 20” 请参阅++*p、*p++及*++p之差异。
Q.10用示例解释深层复制和浅层复制吗?
在下面的C程序中,struct变量st1包含指向动态分配内存的指针。当将st1赋值给st2时,st2的str指针也开始指向相同的内存位置。这种复制被称为浅复制。
C
//C program to demonstrate shallow copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
struct test
{
char *str;
};
int main()
{
struct test st1, st2;
st1.str = ( char *) malloc ( sizeof ( char ) * 20);
strcpy (st1.str, "lsbin" );
st2 = st1;
st1.str[0] = 'X' ;
st1.str[1] = 'Y' ;
/* Since copy was shallow, both strings are same */
printf ( "st1's str = %s\n" , st1.str);
printf ( "st2's str = %s\n" , st2.str);
return 0;
}
输出如下:
st1's str = XYeksforGeeks
st2's str = XYeksforGeeks
去做深拷贝, 我们为动态分配的成员分配新内存并显式复制它们。
C
//C program to demonstrate deep copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
struct test
{
char *str;
};
int main()
{
struct test st1, st2;
st1.str = ( char *) malloc ( sizeof ( char ) * 20);
strcpy (st1.str, "lsbin" );
st2 = st1;
//We add extra statements to do deep copy
st2.str = ( char *) malloc ( sizeof ( char ) * 20);
strcpy (st2.str, st1.str);
st1.str[0] = 'X' ;
st1.str[1] = 'Y' ;
/* Since copy was deep, both strings are different */
printf ( "st1's str = %s\n" , st1.str);
printf ( "st2's str = %s\n" , st2.str);
return 0;
}
输出如下:
st1's str = XYeksforGeeks
st2's str = lsbin