为什么必须在以下代码中将结果变量声明为指针?

时间:2016-11-10 16:13:21

标签: c pointers

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int input;
    char *result;
    printf("Enter a positive integer: \n");
    fflush(stdout);
    scanf("%d",&input);

    result= ((input % 2) ? "odd":"even");
    printf("%s", result);
}

为什么result变量必须在代码中声明为指针?

3 个答案:

答案 0 :(得分:4)

因此它可以指向C风格的字符串。

答案 1 :(得分:3)

看一下三元运算符。

((input % 2) ? "odd":"even"

引用C11,章节§6.5.15

  

评估第一个操作数;它的评价和评价之间有一个序列点   评估第二或第三操作数(以评估者为准)。第二个操作数   仅当第一个比较不等于0时才计算;第三个操作数仅在以下情况下进行评估   第一个比较等于0;结果是第二个或第三个操作数的值   (无论哪个被评估),[....]

因此,它会根据评估生成"odd""even"的结果。现在,要保存结果,您需要有一个指针类型,因为字符串文字解析为指向char的指针。

注意:

引用C11,章节§6.4.5,字符串文字

  

[..]将一个字节或值为零的代码附加到每个多字节   由字符串文字或文字产生的字符序列。 78)多字节字符   然后,序列用于初始化静态存储持续时间和长度的数组   足以包含序列。对于字符串文字,数组元素具有   键入char,并使用多字节字符的各个字节进行初始化   序列。 [...]

答案 2 :(得分:2)

在本声明中

result= ((input % 2) ? "odd":"even");

使用带有字符串文字"odd""even"的条件运算符。字符串文字具有字符数组类型,并具有静态存储持续时间。

例如,字符串文字"odd"的类型为char[4],而字符串文字"even"的类型为char[5]

在具有罕见异常的表达式中使用数组将转换为指向其第一个元素的指针。因此,条件运算符中使用的字符串文字将转换为类型为char *的对象,其中包含字符串文字的第一个字符的地址。

条件运算符返回指向文字"odd"的第一个字符的指针或指向文字"even"的第一个字符的指针,具体取决于对条件(input % 2)的评估。因此,为了接受结果,变量result被声明为指针。

来自C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

3除非它是sizeof运算符或一元&amp;的操作数。   operator,或者是用于初始化数组的字符串文字,a   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。