2010-10-11 114 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的初始值必須是編譯時常量。 包含++運算符的表達式顯然不是一個常量表達式。

相關問題