在C lang FAQ中,我找到了以下代码:
void f(ipp)
int **ipp;
{
static int dummy = 5;
*ipp = &dummy;
}
Run Code Online (Sandbox Code Playgroud)
我测试了使用-Wall -std=c11 -pedantic标志进行编译,并且没有警告或错误的情况下进行了编译。这怎么可能-在函数名称及其块之间声明一个变量?
编辑:
发布几小时后,经过一系列回答,我发现问题已重复存在。我不同意关闭的决定。实际上,到目前为止,重复的问答和此处给出的答案虽然大体上是正确的,但并未具体回答我的问题。
我的查询是关于在函数名称及其块之间出现的变量声明。好的,那是原始的K&R风格,但是我仍然觉得声明的位置令人震惊。阅读了描述ANSI C89的K&R第二版书后,我知道以前的样式允许使用不同的方法来声明函数参数,但是AFAIK那本书没有显示以这种方式进行的声明。也许是这样,我已经忘记了。
我认为,最好单独就这个特定问题提出一个问题,以防将来有人被它抛弃。我的问题应该代表任何可以阐明如何决定允许在此陌生位置声明参数的人。您从C语言和所有受C语言启发的语言中获得的印象是,令牌及其大括号之间没有任何联系。我的问题提请您注意一个重要的例外情况,即使该例外已存在30/40年,也应予以强调并理解其原理。
编辑2:
现在,我发现C ++语法允许在函数名称及其块之间插入标记。即便如此,整个声明行介于两者之间的想法更为严格,值得向C新手指出,因为他们可能会遇到一些怪癖。我已经检查过,《 K&R第二版》的确没有明确提及这一点。
我正在尝试实现我的版本strcat。但是,我收到以下警告,并且我的代码在运行时崩溃。我正在传递&p对main函数p中的变量进行永久更改main。
警告:
\nnote: expected \xe2\x80\x98char **\xe2\x80\x99 but argument is of type \xe2\x80\x98char (*)[10]\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n代码:
\n#include <string.h>\n#include <stdio.h>\n\nvoid mystrcat(char **p, char *q)\n{\n while (**p != '\\0')\n {\n *p++;\n }\n\n while (*q != '\\0')\n {\n **p = *q;\n (*p)++;\n q++;\n }\n *p = '\\0';\n}\n\nint main()\n{\n char p[10] = "ravi";\n char q[12] = "ra";\n\n mystrcat(&p, q);\n printf("%s", p);\n}\nRun Code Online (Sandbox Code Playgroud)\n 所以我遇到了这个函数定义,它接受一个列表(xs)并将其分成三部分作为输出.
问题是我很难理解它.我理解第一部分采用列表中的n(xs),其中n被定义为将列表的长度(xs)除以3.但在那之后,我不确定是否已经确定了什么.
如果有人能指导我完成这项功能,那就太棒了.
这是代码:
--SPLITS A LIST INTO THREE PARTS---------------------------------------------------------
split3 xs = (take n xs , take n (drop n xs) , drop (n*2) xs)
where n = length xs `div` 3
Run Code Online (Sandbox Code Playgroud) 我试图了解如何在 C 中使用递归,但我不知道return它是如何工作的。
请考虑以下代码:
int recur(int i)
{
printf("recur: i = %d\n", i);
if (i < 3)
{
recur(i + 1);
return 10;
}
else if (i < 5)
recur(i + 1);
return i;
}
int main(void)
{
int i = 0;
i = recur(i);
printf("i = %d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
recur: i = 0
recur: i = 1
recur: i = 2
recur: i = 3
recur: i = 4
recur: i = 5
i …Run Code Online (Sandbox Code Playgroud) 在某些情况下,我不明白在函数中如何使用foldr和foldl使用。
这是几个例子,然后我解释为什么我不理解它们:
-- Two implementation of filter and map
map' f = foldr (\x acc -> (f x):acc) []
map'' f xs = foldl (\acc x -> acc ++ [(f x)]) [] xs
filter' f xs = foldr(\x acc -> if(f x) then x:acc else acc) [] xs
filter'' f = foldl(\acc x -> if(f x) then acc++[x] else acc) []
Run Code Online (Sandbox Code Playgroud)
为什么map''使用xsbut non map'?map'列表理解公式也不需要列表吗?
filter'vs 的情况相同filter''。 …
我正在尝试计算 char p[] 中有多少个破折号“-”。我循环遍历字符串,并使用 strcmp 函数将 p[i] 位置处的内容与“-”进行比较。如果它们相同,则 strcmp 函数返回 0。
int howmanyDash( char p[] ){
int length = strlen(p);
int i, count = 0;
for (i = 0; i < length; i++)
{
if (strcmp(p[i], "-") == 0)
{
++count;
}
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
int main(){
char word[20];
scanf("%s", word);
int dashCount = howManyDash(word);
printf("Dashes: %d\n", dashCount);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误如下:警告:不兼容的整数到指针转换将“char”传递给“const char *”类型的参数;取地址 & [-Wint-conversion] if (strcmp(p[i], "-") == 0)
此警告在第 7 行生成: if (strcmp(p[i], "-") == 0)
我正在尝试创建一个带有虚函数的简单基抽象类和一个定义该虚函数的子类。运行以下命令会在编译期间产生错误:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak();
};
class Cat : public Animal{
public:
void speak() override {
cout << "Meow!";
}
};
int main() {
Cat cat;
Animal* base = &cat;
base->speak();
}
// error LNK2001: unresolved external symbol "public: virtual void __thiscall Base::speak(void)" (?speak@Base@@UAEXXZ)
Run Code Online (Sandbox Code Playgroud)
我的 IDE 建议为 Animal 中的 talk() 添加一个无用的定义,并且它有效:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak();
};
void Animal::speak() {
}
class Cat : public …Run Code Online (Sandbox Code Playgroud) 在尝试重新创建“memset”函数时,如果我尝试取消引用 void 指针,或者第二个参数的类型与第一个参数的类型不同,则会出错。为了使该功能正常工作,我必须将其更改为:
void ft_memset(unsigned char *st, unsigned char c, size_t n)
Run Code Online (Sandbox Code Playgroud)
是否可以像手册中那样定义该功能?
void *memset(void *s, int c, size_t n) <- This is the man version.
Run Code Online (Sandbox Code Playgroud)
我只使用库 stdio.h 来使用 size_t 我必须使用 -Wall -Wextra -Werror 进行编译
这是我的代码:
#include <stdio.h>
//stdio.h to use size_t;
//
void *ft_memset(unsigned char *str, unsigned char c, size_t n)
{
unsigned int i;
i = 0;
while (i < n)
{
str[i] = c;
i++;
}
return(str);
}
Run Code Online (Sandbox Code Playgroud) 1561/1563 个测试用例通过
问题描述:
给您两个表示两个非负整数的非空链表。最高有效数字在前,每个节点都包含一个数字。将两个数字相加并以链表形式返回总和。
您可以假设这两个数字不包含任何前导零,除了数字 0 本身。问题链接: https: //leetcode.com/problems/add-two-numbers-ii/
您不需要向我提供代码(会有帮助),只需提供为什么我在接下来的问题中得到错误答案的答案。
void insert_begging(struct ListNode **root,unsigned __int128 val){
struct ListNode *new_node = malloc(sizeof(struct ListNode));
new_node->val = val;
if(*root == NULL){
new_node->next = NULL;
*root = new_node;
return;
}
new_node->next = *root;
*root = new_node;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* result = NULL;
struct ListNode* curr = l1;
unsigned __int128 sum = 0;
unsigned __int128 sum2 = 0;
while(curr!=NULL){
sum=sum*10+curr->val;
curr=curr->next;
}
struct ListNode* curr2 = l2; …Run Code Online (Sandbox Code Playgroud) c reverse linked-list singly-linked-list function-definition
我知道这两个函数之间的区别:Swap(int *x, int *y)vs Swap(int **x, int **y)。
但是,我不确定这种代码是如何工作的。如何将指针指向的地址与常规swap()类型交换?
例如,我相信a创建了一个本地指针变量并且它指向&ptr_x,因此当我取消引用时*x它等于&x。
那么,temp(并且*a也可以用作整数)可以保存/*b的实际地址,这就是它起作用的原因?xy
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
printf("in main:\n");
int x = 2;
int y = 8;
int *ptr_x = &x;
int *ptr_y = &y;
printf("ptr_x points to = %p\n", ptr_x);
printf("ptr_y points to = …Run Code Online (Sandbox Code Playgroud)