C 程序的输出 | 8套
预测以下 C 程序的输出。
问题 1:
c
#include
int main()
{
int x = 5, p = 10;
printf("%*d", x, p);
getchar();
return 0;
}
c
int main()
{
char arr[] = "geeksforgeeks";
char *ptr = arr;
while(*ptr != '\0')
++*ptr++;
printf("%s %s", arr, ptr);
getchar();
return 0;
}
c
int main()
{
signed char i=0;
for(; i >= 0; i++);
printf("%d\n", i);
getchar();
return 0;
}
c
#include
void fun(const char **p) { }
int main(int argc, char **argv)
{
fun(argv);
getchar();
return 0;
}
输出:
10
解释:
请参阅标准 printf函数定义
int printf ( const char * format, ... );
格式:包含要写入标准输出的文本的字符串。它可以选择包含嵌入的格式标签,这些标签被后续参数中指定的值替换并按要求格式化。格式参数后面的参数数量至少应该与格式标签的数量一样多。格式标签遵循这个原型:
%[flags][width][.precision][length]specifier
您可以在此处查看上述所有部分的详细信息 http://www.cplusplus.com/reference/clibrary/cstdio/printf/。
需要注意的主要事情是在关于精度的线下方
* (star) :格式字符串未指定宽度,而是作为必须格式化的参数之前的附加整数值参数。
简单来说,要打印的值必须至少有宽度对应的字符数。这里宽度是5,要打印的值是10。由于它只有两个字符,为了使它成为5,将在10之前打印三个空格。
所以 10 在 3 个空格后打印!!
问题2
C
int main()
{
char arr[] = "geeksforgeeks";
char *ptr = arr;
while(*ptr != '\0')
++*ptr++;
printf("%s %s", arr, ptr);
getchar();
return 0;
}
输出: hffltgpshfflt
解释:
这个问题的关键在于表达式++*ptr++。
如果你知道运算符的优先级和结合性,那么就没有什么可剩下的了。以下是运算符的优先级。
Postfixx ++ left-to-right
Prefix ++ right-to-left
Dereference * right-to-left
因此表达式 ++*ptr++ 具有以下效果
*ptr 的值增加
ptr 的值递增
问题 3
C
int main()
{
signed char i=0;
for(; i >= 0; i++);
printf("%d\n", i);
getchar();
return 0;
}
输出:-128
解释:
在这里,首先要注意的是 for 循环末尾的分号。所以基本上,for 循环没有主体。 printf 将在控制退出 for 循环时打印 i 的值。另外,请注意 for 循环中的第一条语句即初始化程序不存在。但 i 已在声明时初始化。由于 i 是一个有符号字符,它可以取值从 -128 到 127。所以在 for 循环中, i 将不断递增并满足条件,直到发生翻转。在翻转时,i 将在 127 之后变为 -128,在这种情况下,条件不满足并且控制来自 for 循环。
问题 4
C
#include
void fun(const char **p) { }
int main(int argc, char **argv)
{
fun(argv);
getchar();
return 0;
}
输出:编译器错误。
解释:
传递给 fun() 的参数和定义中预期的参数是不兼容的类型。 fun() 需要 const char** 而传递的参数是 char ** 类型。
现在尝试以下程序,它将起作用。
void fun(const char **p) { }
int main(int argc, char **argv)
{
const char **temp;
fun(temp);
getchar();
return 0;
}