Tag: 常量

有没有办法保护变量在C中在运行时被修改?

我想知道是否有任何方法可以保护变量一旦被初始化就被修改(比如在运行时“变量”变量“)。 例如: #include #include int main(void) { int v, op; scanf( “%d”, &op ); if( op == 0 ) v = 1; else v = 2; // here transform v to a constant… . . // …and that any attempt to modify v yields to an error. . . return EXIT_SUCCESS; }

在c / c ++中按位指定浮点常量值

这就是我想要做的: //Let Bin2Float be a magic macro that packages specified bit pattern into float as a constant const float MyInf = Bin2Float(01111111,10000000,00000000,00000000); 我们都知道如何将位模式打包成整数(“二进制常量”黑客),并且这个魔术原型宏的输入与相应的32位整数二进制常量宏的输入相同。 将位打包成整数常量不是问题。 但是,在使用指针和联合投注之后,我意识到将整数类型化为浮点数会导致许多问题(一些在MSVC方面,一些在gcc方面)。 所以这是需求列表: 必须在gcc(C模式),g ++,MSVC下编译(即使我必须使用条件编译来做两个单独的版本) 必须为C和C ++编译 在生成的汇编代码中,必须编译成硬编码常量,而不是动态计算 一定不要使用memcpy 不得使用静态或全局变量 不得使用基于指针的类型惩罚来避免严格别名问题

在C / C ++中定义类型化常量数

在C / C ++中,说(1U)与((unsigned int)1)之间有区别吗? 我更喜欢第二个,但我担心第二个可能在运行时进行类型转换(即额外的cpu周期),而第一个在编译时获得正确的类型。 谢谢。

编译器在转换整数常量时有什么作用?

使用以下宏: #define MIN_SWORD (signed int) 0x8000 例如,以下表达式: signed long s32; if (s32 < (signed long)MIN_SWORD)… 预计会做以下检查: if (s32 < -32768) 一些编译器似乎工作正常。 但在其他一些编译器上,exprssion被评估为: if (s32 < 32768) 我的问题:ANSI-C编译器如何评估以下表达式:( (signed long) (signed int) 0x8000 ? 似乎在某些编译器上,转换为`(signed int)不会导致(预期)从正常数0x8000转换为有符号整数的最小负值,如果之后表达式被转换为更宽泛的有符号长整型。 换句话说,评估的常量不等于:-32768L(但32768L) 这种行为可能是ANSI-C未定义的吗?

ISO C和签名的文字常量

我刚刚开始阅读ISO C 2011标准,以及它的最后公开草案[1] ,并意识到在C词汇语法[1] [458ff。]中所有(字面)数字常数都是无符号的。 这是否意味着编译器将带符号的数值常量(如-5.1E10或-1)解释为相应的一元运算符的调用? 例如-1 – (1),+ 512 +(512) 更新:我的错,“所有(文字)数字常数都是无符号的”我的意思是“所有(文字)数值常数都是非负的” 请注意,托马斯

“const int * ptr =&i”究竟是什么意思?为什么它接受非常数的地址?

你的答案非常寻求清除我对今天意识到的const理解中的这个主要缺陷。 在我的程序中,我使用了语句const int *ptr=&i; 但是没有对变量i使用任何const限定符。两件事令我困惑: 1)当我尝试使用ptr修改i的值时,我使用了const int *ptr=&i; ,我得到assignment of read-only location ‘*ptr’|的错误assignment of read-only location ‘*ptr’| ,即使我没有用const限定符声明变量i 。那究竟是什么语句const int *ptr=&i; 是什么意思,它与int * const ptr=&i;什么不同int * const ptr=&i; ? 我把它钻进了我的脑袋里, const int *ptr=&i; 表示指针存储常量的地址,而int * const ptr=&i; 指的是指针本身是常量并且不能改变。但今天有一个用户在讨论中告诉我( LINK ) const int *ptr means the memory pointed to must be treated as nonmodifiable _through this […]

如何修改const变量的值?

我能够在gcc中更改const修改变量的值,但不能在其他编译器中更改。 我在gcc上尝试了这个代码,它更新了i和j (11)的值。 使用在线编译器 ,我得到不同的值。 #include void main() { const int i=10; int *j; j = &i; (*j)++; printf(“address of j is %p address of i is %p\n”,j,&i); printf(“i is %d and j is %d\n”,i,*j); }

不使用#define的全局常量

好吧,我正在寻找一组内存地址作为.h文件中的常量,这些常量由一堆.c文件使用(我们在C中,而不是C ++)。 我希望能够看到变量的名称 ,而不是只看到调试器中的hex地址…所以我想将我当前拥有的#defines转换为全局范围的常量。 问题是,如果我这样定义它们: const short int SOME_ADDRESS = 0x0010 然后我得到了可怕的“多声明”错误,因为我有多个.c文件使用相同的.h。 我想使用枚举,但是这不起作用,因为它默认为整数(在我的系统上是16位……我需要对类型有更好的控制)。 我想把所有的地址都放在一个结构中…但我没有办法(我知道)在头文件中设置结构实例的默认值(我不想假设一个特定的.c文件首先使用结构并在其他地方填充它。我真的想在.h文件中定义常量) 我开始时看起来很简单,但是我没有看到在头文件中定义全局可用的short int常量的好方法……任何人都知道这样做的方法吗? 谢谢!

在C中使用枚举而不是#defines用于编译时常量是否合理?

在使用C ++一段时间后,我回到了一些C开发阶段。 我已经明白,如果没有必要支持让编译器在编译时为你做更多工作,应该避免使用宏。 因此,对于常量值,在C ++中我会使用静态const变量,或者使用C ++ 11枚举类来实现优秀的范围。 在C中,静态常量不是真正的编译时常量,枚举可能(?或可能不?)的行为略有不同。 那么,更喜欢使用枚举作为常量而不是#defines是否合理? 作为参考,这里有一个很好的列表,包括枚举,#define和C ++中的静态consts 。

C printf%d带前导零的错误值?

C函数printf似乎打印不同的值,具体取决于是否存在前导零。 我试图确定Linux’open’系统调用中mode参数的数值。 printf(“mode:%d\n”,S_IRWXU); printf(“mode:%d\n”,00700); 两个人都给了我448,而 printf(“mode:%d\n”,700); 给我700,正如我所期望的那样。 这里发生了什么? 我正在使用gcc(Ubuntu 5.4.0-6ubuntu1~16.04.5)5.4.0 20160609