先决条件 : 结构填充 , 整数升级 和 序列点 . 问题1。 考虑下面的代码:
C
#include<stdio.h> struct geeks{ int i; char c; } obj; int main() { printf ( "%ld" , sizeof (obj)); } |
以上代码的输出是什么? A. 4. B 5. C 8. D 无法确定
Output: Can't be determined
说明: 都是关于 结构填充 .C编译器知道,在RAM中存储未对齐的数据可能成本高昂,因此它会根据需要填充数据。如果一个结构中有5个字节的数据,它可能会变成8、16或6。或者随便什么。还有一些扩展,比如GCC属性 对齐的 和 拥挤的 这允许对这个过程进行一些控制,但它们是非标准的。C本身不定义填充属性。所以正确的答案是“无法确定”。 问题2。 考虑下面的代码:
C
#include<stdio.h> int main(){ char a = 0; short int b = 0; printf ( "%d" , sizeof (b) == sizeof (a+b)); return 0; } |
以上代码的输出是什么? A. 0 B 1. C 2. D 无法确定
Output: Can't be determined
说明: 都是关于 整数升级 。对“char”、“short int”等数据类型执行计算时,它们会自动升级为“int”。但即便如此,表达式(sizeof(b)==sizeof(a+b))比较大小而不是类型,根据C标准,可以保证’short int’的大小不能大于’int’的大小。因此,我们无法确定‘sizeof(a+b)’将返回什么,因此正确答案是‘无法确定’。 问题3。 考虑下面的代码:
C
#include<stdio.h> int main() { char a = ' ' * 13; printf ( "%d" , a); return 0; } |
以上代码的输出是什么? A. 416 B 160 C -96 D 无法确定
Output: Can't be determined
说明: 空格字符(“”)的ASCII值为32,首先是表达式 (‘ ‘ * 13) 不会出现整数溢出(因为整数提升),因此行为未定义。其次,“字符类型”(有符号或无符号)不是由标准定义的,因此它将是特定于实现的。 但更重要的是,字符类型本身的大小也不是以位为单位指定的。有6位的平台( 三字母词 ),并且有五种整数类型都是32位的平台。如果没有详细说明,关于结果的所有猜测都是无效的,因此答案是:“无法确定”。 第四季度。 考虑下面的代码:
C
#include<stdio.h> int main() { int i = 16; printf ( "%d" , (((i >= i) << i) >> i) <= i); return 0; } |
以上代码的输出是什么? A. 0 B 1. C 16 D 无法确定
Output: Can't be determined
说明: 上述表达式的输出取决于编译器,因为C标准中没有直接指定“int”的大小。它很容易是16位,然后比较后的第一个操作((i>=i)< 问题5。 考虑下面的代码:
C
#include<stdio.h> int main() { int i = 0; int ans = i++ + ++i; printf ( "%d " , ans); return 0; } |
以上代码的输出是什么? A. 1. B 2. C 3. D 无法确定
Output: Can't be determined
说明: 在C语言中,表达式“ i++++i “没有任何意义,因为它违反了一条规则,即同一个变量在没有 序列点 . 序列点基本上是编译器保证完成所有计算的代码点。例如,语句末尾的分号就是序列点 . 在这个表达式中,变量“i”的值在没有序列点的情况下改变了两次。因此,编译器可以做任何它想做的事情,并将导致未定义的行为。因此答案将是“无法确定”。 工具书类 : https://hackernoon.com/so-you-think-you-know-c-8d4e2cd6f6a6