c - 为什么用三元运算符初始化数组是非法的?

标签 c arrays ternary-operator

C 让我可以经常互换使用 char 指针和数组,以至于我经常认为它们是完全可以互换的。但是下面的代码证明这是不正确的。谁能解释为什么在下面的代码中使用三元运算符初始化 const char d[] 是非法的?

/* main.c */
#include <stdio.h>

int main()
{
  const char* a = "lorem";
  const char b[] = "ipsum";
  int* p;
  const char* c = ( *p ? "dolor" : "sit" );
  const char d[] = ( *p ? "amet" : "consectetur" ); // Why am I an error?
  return 0;
}

编译:

> gcc -g main.c 
main.c: In function \u2018main\u2019:
main.c:10:20: error: invalid initializer
   const char d[] = ( *p ? "amet" : "consectetur" ); // Why am I an error?

相关问题:如果我的术语在这里不够精确:描述 const char d[] 的正确术语是什么?它是一个数组吗?变长数组?还有别的吗?它不被视为指针 - 是吗?

编辑:我相信 Array initialization with a ternary operator? 没有回答这个问题

RE:引用问题,我相信前提略有不同。例如。接受的答案解释说 { 1, 2 }; (或 { 'a', 'b' );)不是有效的 C 表达式,我已经知道并接受了。但是 "amet";"consectetur"; 是有效的 C 表达式。

最佳答案

6.7.9 Initialization

...
14 An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

C 2011 Online Draft

( *p ? "amet": "consectetur") 不是字符串文字,也评估为字符串文字.它计算为 char * 类型的表达式,它本身不是有效的数组初始值设定项,并且该计算直到运行时才会发生。

更不用说,p 是未初始化的,所以表达式从一开始就是未定义的。

关于c - 为什么用三元运算符初始化数组是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54427661/

相关文章:

PHP 通过嵌套键值删除数组

javascript - 具有多个条件的 JS 三元函数?

javascript - 三元运算符返回 "true : false"。为什么?

c - 嵌入式 C : manager for global variables

c - 为什么在 Redis 源代码中我没有看到内存屏障?

javascript - 映射一个数组并根据对象键返回一个新数组

ruby-on-rails - 2个大小写不同的字符串数组的交集

c++ - 为什么三元运算符在我的代码中不起作用?

c - osx 和/或 linux 上进程范围的命名属性

c - 使用系统调用从终端读取并输出输入的最后 6 行