两种不同的输出

时间:2010-10-11 12:56:56

标签: c initialization operators

 #include<stdio.h>

int main(void)
{
   static int i=i++, j=j++, k=k++;
   printf("i = %d j = %d k = %d", i, j, k);
   return 0;
}

Turbo C 4.5中的输出:

  

i = 0 j = 0 k = 0

在gcc中我收到错误:

  

Initializer元素不是常量

哪一个在逻辑上是正确的?我有点困惑..

5 个答案:

答案 0 :(得分:12)

标准说关于初始化(6.7.8):

  

4具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。

(这是来自C99,但C89几乎完全相同。)

因此看起来GCC比15岁的弃权更正确。 (谁是一个thunk吗?)

答案 1 :(得分:2)

我知道这不是一个答案,但是,为什么还要使用一个复杂的例子进行测试?

好的,让我们简化一切:

#include<stdio.h>
int main(void)
{
   static int i;
   printf("i = %d", i);
   return 0;
}

输出:

i = 0

但是如果......?

 #include<stdio.h>
 int main(void)
{
   static int i=i;
   printf("i = %d", i);
   return 0;
}

输出:

prog.c: In function ‘main’:
prog.c:4: error: initializer element is not constant

答案 2 :(得分:1)

GCC在这里是正确的。

static变量初始化(在程序加载时)到初始化程序中指定的值(如果没有给出初始化程序,则初始化为0)。由于此初始化在程序启动之前发生,因此static变量的初始化程序必须是编译时常量。 包含++运算符的表达式显然不是常量表达式。

答案 3 :(得分:0)

我猜GCC在这里是正确的。初始值设定项不应该是变量。 在定义变量之前,您尝试使用自身初始化变量。

我猜Turbo C“原因”,i在所有静态变量之后,因此应该具有零值(因为所有静态变量都有默认值),然后继续忽略++操作。

答案 4 :(得分:0)

伙计你没有初始化变量并且你递增它们,因为你没有初始化任何变量它会占用垃圾值而我不认为所以增加任何垃圾值是正确的事情。所以请首先初始化变量然后递增它们。你会得到正确的答案。