Tag: 语言设计

为什么C / C ++字符串文字声明必须是单行的?

是否有任何特殊原因在C ++中不允许使用以下多行字符串文字? string script = ” Some Formatted String Literal “; 我知道可以通过在每个换行符之前放一个反斜杠来创建多行字符串文字。 我正在编写一种编程语言(类似于C),并希望能够轻松创建多行字符串(如上例所示)。 是否有任何技术原因可以避免这种字符串文字? 否则我将不得不使用类似python的字符串文字与三引号(我不想这样做): string script = “”” Some Formatted String Literal “””; 为什么C / C ++字符串文字声明必须是单行的?

C中的指针语法:为什么*仅适用于第一个变量?

C中的以下声明: int* a, b; 将声明a类型为int*和b作为int类型。 我很清楚这个陷阱,但我想知道的是它为什么会这样运作。 为什么不像大多数人直觉所期望的那样将b声明为int* ? 换句话说,为什么*适用于变量名,而不是类型? 当然你可以用这种方式写它,以便与它的实际工作方式更加一致: int *a, b; 但是,我和我所说过的所有人都认为a是“指向int”的类型 ,而不是a是指向某些数据的指针 ,而该数据的类型是“int” 。 这对C的设计者来说简直是一个糟糕的决定还是有一些很好的理由为什么它会被解析? 我确定之前已经回答了这个问题,但我似乎无法使用搜索找到它。

为什么c / c ++允许在函数调用中省略多维数组的最左边索引?

我只是想知道为什么在将数组传递给函数时允许省略多维数组的最左边索引? 为什么不是一个以上的索引? 编译器如何在省略一个索引的情况下找出大小?

为什么这在C中合法?

我正在为我的大学编写一个编译器/语言课程的玩具C编译器。 我试图在C中充实符号解析的语义,并提出了我尝试对常规编译器clang&gcc的测试用例。 void foo() { } int main() { foo(5); } // foo has extraneous arguments 大多数编译器似乎只是警告无关的论点。 问题:这背后的根本原因是什么? 对于我的符号表生成/解析阶段,我正在考虑将函数作为具有返回类型的符号,以及几个参数化参数(基于语法),每个参数都具有相应的类型。 谢谢。

假设指针是C中int的大小是否安全?

在设计新的编程语言时,可以安全地假设C int和指针在机器上的大小相同吗?

为什么汇编需要这么长时间?

我正在设计一种编程语言,我想到的问题之一就是为什么编程语言需要很长时间才能编译。 假设c ++需要很长时间,因为它需要在每次编译文件时解析并编译头文件。 但是i -heard-预编译的头文件需要多长时间? 我怀疑c ++不是唯一有这个问题的语言。

为什么/ C允许隐式函数和无类型变量声明?

为什么语言允许隐式声明函数和无类型变量? 我知道C是旧的,但是允许省略声明并且默认为int() (或者在变量的情况下为int )对我来说似乎并不那么理智,即使在那时也是如此。 那么,为什么它最初被引入? 它真的有用吗? 它实际上(仍然)使用过吗? 注意:我意识到现代编译器会给你警告(取决于你传递它们的标志),你可以抑制这个function。 那不是问题! 例: int main() { static bar = 7; // defaults to “int bar” return foo(bar); // defaults to a “int foo()” } int foo(int i) { return i; }

为什么C / C ++中没有^^运算符?

& has && 。 | 有|| 。 为什么不^ ^^ ? 我知道它不会短路,但会有不同的语义。 在C中, true是任何非零值。 按位异或并不总是与逻辑XOR相同: int a=strcmp(str1,str2);// evaluates to 1, which is “true” int b=strcmp(str1,str3);// evaluates to 2, which is also “true” int c=a ^^ b; // this would be false, since true ^ true = false int d=a ^ b; //oops, this is true again, […]

什么是forms参数?

在C ++中进行编译时,我经常会遇到处理“forms参数”的错误消息,例如 error C2719: ‘b’: formal parameter with __declspec(align(’16’)) won’t be aligned 我确实理解错误,以及b是我定义的函数的参数这一事实。 但是,参数是正式的是什么意思? 还有非正式参数吗? 我注意到术语“forms参数”也出现在其他语言中,所以我认为它是一个更通用的术语,不一定特定于C族语言? 某些语言子集是否支持非正式参数? 看到答案后,最后一个问题:那些名称forms参数和实际参数来自何处? 它是源于C标准,还是在某些抽象语言演算中调用它的效果?

C99 – 为什么假和真的定义为0和1而不是((bool)0)和((bool)1)?

偶然发现了一个失败的断言,因为它将false与函数的返回类型进行比较,因为函数本身返回了一个bool并且断言不仅检查了值,而且还检查了返回值的类型以匹配false,保证,返回一个bool。 现在的问题是,C99将bool定义为_Bool,_Bool甚至不一定与int相同(实际上,根据我的经验,在现今的大多数平台上它通常与unsigned char相同),不要谈论相同type(实际上这是不可能的,因为_Bool是C99中语言的内置类型),但是将false和true定义为0和1而没有任何类型转换和没有类型转换的预处理器定义将默认为int。 如果C99改为将false和true定义为((bool)0)和((bool)1),它们将始终是bool类型,无论如何定义_Bool。 那么有没有什么好的理由让它们总是被定义为int,即使bool不是那个平台上的int,或者这只是语言中的一个bug,应该用C1x修复?