簡體   English   中英

如果 x 具有枚舉類型, x * x (和類似的)是否會導致違反約束?

[英]Does x * x (and similar) lead to constraint violation if x has enumerated type?

C11,6.2.5 類型,18:

Integer 和浮點類型統稱為算術類型

C11,6.2.5 類型,16:

一個枚舉包含一組命名的 integer 常量值。 每個不同的枚舉構成不同的枚舉類型

C11,6.5.5 乘法運算符,約束,2(已添加重點):

每個操作數都應具有算術類型

示例代碼:

enum E { a };
int f(enum E x)
{
        return x * x;
}

調用:

$ gcc t0.c -std=c11 -pedantic -Wall -Wextra -c
<nothing>

$ clang t0.c -std=c11 -pedantic -Wall -Wextra -c
<nothing>

$ icc t0.c -std=c11 -pedantic -Wall -Wextra -c
<nothing>

$ cl t235.c /std:c11 /Za /c
<nothing>

問題: x * x (和類似的)是否會導致違反約束?

據我了解,操作數x具有枚舉類型,而不是算術類型

枚舉類型為 integer 類型,屬於算術類型。 沒有違反約束。

從 n1548:6.2.5.17

char類型、有符號和無符號integer類型、枚舉類型統稱為integer類型。

正如您所指出的,“整數類型”是算術類型。

我不明白你指的是什么約束。

根據C標准(6.2.5型)

17 char類型、有符號和無符號integer類型、枚舉類型統稱為integer類型 integer 和實浮點類型統稱為實類型。

運算符 * 是為 integer 類型定義的,因為它們是算術類型的一部分。

18 Integer和浮點類型統稱為算術類型。

只有您需要記住,將運算符應用於枚舉類型的對象和它的枚舉數之間是有區別的。 C 中的枚舉器始終具有int類型,而兼容的 integer 枚舉類型是實現定義的。

考慮以下演示程序。

#include <stdio.h>

int main(void) 
{
    enum E { a = 1 };
    
    enum E e = a;
    
    printf( "e * -1 < 0 is %d\n", e * -1 < 0);
    printf( "a * -1 < 0 is %d\n", a * -1 < 0);

    return 0;
}

其output可以

e * -1 < 0 is 0
a * -1 < 0 is 1

與 C++ 中的 C 相反,枚舉不是整數類型,但是可以將無作用域的枚舉提升為整數類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM