Tag: 语法

用于无大括号,空白敏感的C语法的工具

我现在正在写一些C,因为我喜欢空格敏感的语法,我想这样写: #include int main(void) printf(“Hello, world!”) return 0 而不是这个: #include int main(void) { printf(“Hello, world!”); return 0; } 有没有人知道将前者转换为后者的工具? 编辑:我真的没有兴趣与那些认为这是个坏主意的人争论。 通过各种方式继续认为,你有你的理由。 但至少知道这一点:我知道Python是一种空格敏感的语言,但我还没有使用它。 我为什么要? 我已经知道Ruby了。 也知道:我不仅仅是第一次学习C而且我已经使用PHP和JavaScript超过四年了,所以我并不是出于某些个人困难,对块语法缺乏熟悉或教条联系而要求这样做。 我也知道写这些内容会涉及到什么,这不是我的能力,但我不希望这足以certificate花时间写一个。

GCC源代码中的C语法

我正在寻找GCC源代码中的C语法,更具体地说是yacc / bisonforms的语法。

在C中,为什么在这个例子中有围绕(int)的括号?

decimal d = 2; int i = (int) d; 我已经多次看到这些括号围绕数据类型。 为什么不使用int i = int d; ?

为什么指针声明中的星号特定于标识符而不是数据类型?

愚蠢的问题,但试图掌握潜在的机制/哲学来巩固我的理解。 int myInt; // declares a variable of type integer, named myInt. Intuitive. int* myPtr; // declares a variable of type pointer-to-integer. Also intuitive. int myInt2, myInt3; // two more integer variables.. yay!! This makes sense. // so the pattern is [type] [identifier] ; int* myInt4, myInt5; // an int pointer then an integer. Brain […]

在此C程序中返回结构时出错的原因是什么?

我的计划打算实现这一目标 (A)编写一个名为larger()的C函数,它返回传递给它的任何两个日期的后期日期。 例如,如果将日期10/9/2001和11/3/2001传递给greater larger() ,则将返回第二个日期。 (B)在完整单元中创建为(A)编写的large()函数。 将large()返回的日期结构存储在单独的日期结构中,并显示返回的数据结构的成员值。 我正在为我的C语言课程研究这个问题。 我一切顺利(我想),除了我不断得到“更大的日期是:0/0/0”,无论我输入什么。 所以我开始修补,现在我无法摆脱语法错误,或弄清楚我的0/0/0问题。 显然日期并没有让它重新开始。 我对此仍然很陌生(并且在结构上非常新),所以任何帮助都会很棒! 给我语法错误的行靠近main()的底部: DATES result[NUM] = larger(DATES user[NUM]); 代码全部: #include #define NUM 2 struct Dates { int month; int day; int year; }; typedef struct Dates DATES; DATES larger(DATES[NUM]); DATES more; int main() { DATES user[NUM]; printf(“You will enter two dates, and the program will […]

C ++中函数的可变参数数量

我如何在C ++中的函数中拥有可变数量的参数。 C#中的模拟: public void Foo(params int[] a) { for (int i = 0; i < a.Length; i++) Console.WriteLine(a[i]); } public void UseFoo() { Foo(); Foo(1); Foo(1, 2); } Java模拟: public void Foo(int… a) { for (int i = 0; i < a.length; i++) System.out.println(a[i]); } public void UseFoo() { Foo(); Foo(1); Foo(2); }

(char *)0在c中的含义是什么?

if ( fgets( line, sizeof(line), stdin ) == (char*) 0 )… 我不明白这条线的作用,谁知道呢?

Java数组初始化列表以逗号结尾

数组初始化列表中使用的逗号,项分隔符可以在C中结束列表,这在Kernighan&Ritchie编写的第二版C编程语言中提到。 例如 int c[] = { 1, 2, 3, }; 当列表很长时,这很方便,并且在添加项目时不希望更改/检查上一行 long long c[] = { 22342342344, 4324234234, 12312311111, }; 但是在Java中我可以观察到两种不同的行为: 在Eclipse中,接受结束,而某些版本的maven编译器插件会抱怨并抛出编译错误。 但是,我没有在Flanagan的Java书中找到任何关于这种奇点的提及。 关于初始化项后结束逗号的官方规则是什么? 建议不要使用它吗?

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*并创建了一个新类型。 […]

_Atomic类型说明符和限定符之间的C11语法歧义

我正在尝试根据N1570编写C11的lex / yacc语法。 我的大部分语法都是从信息性语法摘要中逐字复制的,但是出现了一些yacc冲突。 我设法解决了除了一个之外的所有问题:当’_Atomic’用作类型说明符和用作类型限定符时,似乎存在一些歧义。 在说明符forms中,_Atomic紧跟着括号,所以我假设它与C的很少使用的语法有关,它允许声明符在括号中,从而允许括号立即跟随限定符。 但我的语法已经知道如何区分typedef名称和其他标识符,所以yacc应该知道差异,不应该吗? 我不能为我的生活想到一个实际上是模棱两可的案例。 我怀疑它有帮助,但这是我使用yacc的-v标志时获得的相关状态输出。 “ATOMIC”显然是我的“_Atomic”的令牌名称 state 23 152 atomic_type_specifier: ATOMIC . ‘(‘ type_name ‘)’ 156 type_qualifier: ATOMIC . ‘(‘ shift, and go to state 49 ‘(‘ [reduce using rule 156 (type_qualifier)] $default reduce using rule 156 (type_qualifier)