2010-10-11 67 views
4
#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 element is not constant

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

+1

很明显,没有人应该再次使用Turbo C。只是说。 – Ruel 2010-10-11 13:14:14

+1

或'int i = i ++'。 – Ken 2010-10-11 14:26:22

回答

12

标准说,大约初始化(6.7.8):

4   All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

(这是从C99,C89,但几乎说完全一样的东西。)

所以它看起来好像GCC不止正确15岁的弃用软件。 (谁会推它呢?)

+1

最后一句话+1。 – Ruel 2010-10-11 13:22:38

+1

+1为参考 – ThR37 2010-10-11 13:32:44

+1

+2为参考&+1为最佳答案 – Aboelnour 2010-10-11 13:40:45

0

我猜GCC在这里是正确的。初始化器不应该是一个变量。 在尝试定义之前,您尝试使用自己初始化变量。

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

+1

静态变量会自动初始化为0. – Parikshita 2010-10-11 13:00:25

+0

@Parixit,oops我错过了那个关键字。 – 2010-10-11 13:04:45

0

好友你还没有初始化变量和增加它们,因为你还没有初始化任何变量它将采取垃圾值,我不认为如此增加任何垃圾值是正确的事情。所以请首先初始化变量然后增加它们。你会得到正确的答案。

+1

嘿..我想你错过了静态关键字.. – Parikshita 2010-10-11 13:16:38

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 
1

GCC是正确的在这里。

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