对C宏扩展和整数运算感到困惑

gol*_*ean 3 c macros c-preprocessor

可能重复:
一个谜语(在C中)

关于以下代码段,我有几个问题:

#include<stdio.h>

#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

int main()
{
int d;

for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里代码的输出不会按预期打印数组元素.但是当我添加一个(int)的类型转换时,ELEMENTS的宏定义为

 #define TOTAL_ELEMENTS (int) (sizeof(array) / sizeof(array[0]))
Run Code Online (Sandbox Code Playgroud)

它按预期显示所有数组元素.

  • 这种类型转换是如何工作的?

基于此,我有几个问题:

  • 如果我有一些宏定义,这是否意味着:

    #define AA (-64)

默认情况下,在C中,所有定义为宏的常量都等同于signed int.

如果是,那么

  • 但是,如果我必须强制在宏中定义一些常量,因为unsigned int是否有任何常量后缀而不是我可以使用(我试过UL,UD既不起作用)?

  • 如何在宏定义中定义常量以表现为unsigned int?

Mir*_*toš 12

看看这一行:

for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
Run Code Online (Sandbox Code Playgroud)

在第一次迭代中,您正在检查是否

-1 <= (TOTAL_ELEMENTS-2)
Run Code Online (Sandbox Code Playgroud)

运算符size_of返回无符号值,检查失败(在32位机器上签名为-1 signed = 0xFFFFFFFF).

循环中的一个简单更改可以解决问题:

for(d=0;d <= (TOTAL_ELEMENTS-1);d++)
printf("%d\n",array[d]);
Run Code Online (Sandbox Code Playgroud)

回答你的其他问题:C宏是按文本扩展的,没有类型的概念.C编译器将您的循环视为:

for(d=-1;d <= ((sizeof(array) / sizeof(array[0]))-2);d++)
Run Code Online (Sandbox Code Playgroud)

如果要在宏中定义无符号常量,请使用通常的后缀(ufor unsigned,ulfor unsigned long).

  • fyi,循环和数组的C语言是这样的:int i; for(int i = 0; i <arrLen; i ++){printf("%d \n",arr [i]); 你从0开始测试小于长度. (3认同)

Sku*_*del 7

sizeof以无符号格式返回字节数.这就是你需要演员的原因.

在这里查看更多.