Tag: 类型

C / C ++中的typedef是否真的通过组合复合类型(例如int *)来创建一个NEW类型?

最近我发现我的代码中的typedef与我提出的完全不同。 像这样的例子: typedef int *ptype; ptype v1 = 0, v2 = 0; 结果:v1和v2都被定义为指向int类型的指针。 但是如果你只是在第二句中用int *替换ptype为int *v1 = 0, v2 = 0; 或int* v1 = 0, v2 =0; ,只有v1是指针,v2是普通的int 。 似乎typedef不做简单的替换。 更重要的是,当涉及到复杂的修饰符时: typedef int *ptype; const ptype v3 = 0; 结果将是:v3是一个const指针,如果我们写const int *v3 = 0; ,则不是指向const int的指针const int *v3 = 0; 。 在上面的代码中, const表示整个ptype的修饰符,而不是ptype的int 。 因此,看起来像typedef结合了复合类型int*并创建了一个新类型。 […]

如何将不同类型存储在内存中

我目前正在编写一个涉及处理字节的C程序。 说到字节,我真的很担心以下问题。 字符是否由ascii代码存储在内存中? 说’A’有anscii代码65.所以它以与整数65相同的方式存储在内存中? 如果是这样,机器如何区分字符和整数? 如果字符由ascii代码存储,则ascii代码是整数。 一个整数应占用至少2个字节,一个字符怎么只占用1个字节? 最后一个是关于不同体系结构的整数。 在16位机器上,如果1存储为000 … 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?

C宏是否隐式投射?

我搜索了SO,但没有找到这个具体问题的答案。 如果它已被回答,请原谅我。 如果您有以下内容: #define MACRO 40 您不将它分配给在循环中使用它的变量: for(int i = 0; i < MACRO; i++) {… 然后,perprocessor创建: for(int i = 0; i < 40; i++) {… 然后编译器会将它隐式地转换为int,因为比较是使用int i类型吗? 我看过这个问题#define变量的类型 ,以及Edgar Bonet的一些答案意味着编译器选择如何处理宏的顺序? 这个问题, C ++如何隐式地将参数转换为比较器,如<? ,也有人建议,但只描述了隐式转换如何与两种类型进行比较。 由于宏实际上没有类型,我不确定这是否适用。

C中sizeof()返回值的正确格式说明符

我有以下代码: #include int main() { printf(“The ‘int’ datatype is \t\t %lu bytes\n”, sizeof(int)); printf(“The ‘unsigned int’ data type is\t %lu bytes\n”, sizeof(unsigned int)); printf(“The ‘short int’ data type is\t %lu bytes\n”, sizeof(short int)); printf(“The ‘long int’ data type is\t %lu bytes\n”, sizeof(long int)); printf(“The ‘long long int’ data type is %lu bytes\n”, sizeof(long long int)); […]

C中的函数式编程(Currying)/类型问题

作为一个染成羊毛的function性程序员,我发现很难不把我最喜欢的范例变成我正在使用的语言。 在编写一些CI时,我想要讨论我的一个函数,然后传递部分应用的函数。 看完之后有没有办法在C里做cur? 并注意到http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions上的警告我提出: #include typedef int (*function) (int); function g (int a) { int f (int b) { return a+b; } return f; } int f1(function f){ return f(1);} int main () { printf (“(g(2))(1)=%d\n”,f1(g(2))); } 哪个按预期运行。 但是,我的原始程序使用double s,所以我想我只是改变了适当的类型,我会没事的: #include typedef double (*function) (double); function g (double a) { double f (double b) { […]

如何编写解决方案以处理大量数据?

我正在做一些Project Euler问题,而且大多数时候,计算涉及超出int,float,double等的大量数字。 首先,我知道我应该寻找更有效的计算方法,以避免出现大量问题。 我听说过Bignum图书馆。 但是,对于学术界的兴趣,我想知道如何编写我自己的解决方案来解决这个问题。 任何专家都可以帮帮我吗? (我的语言是C)

为什么不是新的(特定于位宽)printf()格式选项字符串作为C99的一部分?

在研究如何在C中执行跨平台printf()格式字符串时(也就是考虑到我希望每个整数参数对printf()的位数应该是)我在printf()上浏览维基百科文章的这一部分printf() 。 本文讨论了可以传递给printf()格式字符串的非标准选项,例如(似乎是特定于Microsoft的扩展名): printf(“%I32d\n”, my32bitInt); 它接着说: ISO C99包括inttypes.h头文件,其中包含许多用于独立于平台的printf编码的宏。 …然后列出一组可在所述标题中找到的宏。 查看头文件,使用它们我必须写: printf(“%”PRId32″\n”, my32bitInt); 我的问题是:我错过了什么吗? 这真的是标准的C99方式吗? 如果是这样,为什么? (虽然我从未见过以这种方式使用格式字符串的代码并不感到惊讶,因为它看起来很麻烦……)

为什么要输入一个void指针?

作为C的新手,我从void指针中获得的唯一实际用法是用于在给定指针中存储不同数据类型的多function函数。 因此,在进行内存分配时,我没有输入指针。 我见过一些有时使用void指针的代码示例,但是它们是类型转换的。 为什么这有用? 为什么不直接创建所需类型的指针而不是void?

字符常量的类型

我正在学习物理,在我们的编程课程的讲义中,写了一个字符常量,在C中有char类型,其中字符常量我的意思是像‘x’这样的表达式。 在询问我的讲师是否是一个错误后,他说没有。 在向他展示了C90,C99和C11之后,在那里明确写出一个字符常量具有int类型,他仍然没有说这是一个错误。 所以在再次问他之前,我想向自己保证我的方法是正确的,为什么会这样,因为它似乎浪费了记忆。 我发现的一切都是为什么会这样,是因为历史原因,这是相当含糊的。 另外我想知道为什么在C ++中,他们将字符常量的类型更改为char 。 编辑:非常感谢你的答案。

定义类型的顺序

对于将变量定义为static和long/double或其他类型的顺序,是否有任何首选项/约定/规则? 例如是 static double a; 与…一样 double static a; function有什么不同吗? 以上,a是可变的。