今天我在开发C课程时,我的一所大学指出我做错了什么。
他说我正在做的代码与下面的代码类似是错误的,你不能根据另一个常量定义一个常量。 无论如何,该计划结束了,我想知道他是否正确。 以下代码是否错误/打破了最佳做法?
const int num=5;
const int num2=num*2;
答案 0 :(得分:8)
这些不是常数;它们是具有int
限定符的const
个变量。 const
限定符意味着程序无法写入变量。实际整数常量表达式的示例包括5
,2 + 3
和sizeof(int)
。 Here is a full list
在文件范围内,第二行是约束违规,因为变量的名称不是常量表达式。约束条件是C11 6.7.9 / 4:
具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
(在文件范围内声明的变量具有静态或线程存储持续时间)。
在块范围内,代码是正常的,因为初始化程序不需要是那里的常量表达式。
答案 1 :(得分:3)
在C中实现这一目标的经典方法(你可能知道)是写
#define NUM 5
#define NUM2 (NUM*2)
表达式周围有括号,但行末没有分号,因为预处理器将宏扩展为简单的词法替换。因此,表达式20/NUM2
将扩展为20/(5*2)
。如果没有括号,那就是20/5*2
,这是错误的。
顺便说一句,在C ++中,您可以使用constexpr
来获得所需的行为; constexpr
变量可以在静态初始化程序或模板参数中使用。