[英]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.