我知道这里有一些关于 p++、++p 和 p+1 之间区别的解释,但我还不能清楚地理解它,尤其是当它不使用该函数时:
void replace(char * str, char c1, char c2){
if (*str == '\0') {
return;
}else if (*str == c1) {
printf("%c", c2);
}
else {
printf("%c", *str);
}
replace(++str, c1, c2);
}
Run Code Online (Sandbox Code Playgroud)
当我这样做replace(++str, c1, c2);或replace(str+1, c1, c2);它有效时,但replace(str++, c1, c2);没有。为什么?
关于 Haskell 我不完全理解的一件事是声明函数及其类型:这是您必须做的事情还是只是为了清晰起见而应该做的事情?还是在某些情况下您需要这样做,而不是全部?
对于代码:
int hi(int);
int hi();
int main()
{
hi(3);
}
Run Code Online (Sandbox Code Playgroud)
我没有收到任何编译错误(调用hi(); 不带参数确实会出现编译错误)。
我预计编译器会抱怨该函数已经以不同的方式声明了。知道为什么会出现这种行为吗?
我不明白为什么接受以下声明:
typedef void (*_tStandardDeclaration)(LPVOID);
Run Code Online (Sandbox Code Playgroud)
而以下不是:
typedef void *_tDeclarationWithoutParenthesis(LPVOID);
typedef void* _tAlternateDeclaration(LPVOID);
Run Code Online (Sandbox Code Playgroud)
我正在使用MSVC6(我知道它是过时的和非标准的,但它需要保持每年十亿的收入系统:/)
可能重复:
替代函数语法
在复杂的函数模板中,有时需要使用C++ 11尾随返回类型语法才能使用decltypeon参数,否则这些参数会进入范围太晚:
template<typename T, typename U>
auto add(const T& a, const U& b) -> decltype(a + b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
从现在开始总是使用这种新语法,即使对于普通函数,也不会更加一致吗?
auto main() -> int;
Run Code Online (Sandbox Code Playgroud)
然后我们只需要在现代代码中处理一个函数语法而不是两个函数语法,我们可以弃用旧语法,就像我们不推荐使用隐式int或隐式使用声明一样.
为了使新语法更具吸引力,我们可以auto用更好的名称替换:
#define def auto
Run Code Online (Sandbox Code Playgroud)
突然间,签名main看起来对功能程序员非常有吸引力:
def main() -> int;
Run Code Online (Sandbox Code Playgroud)
我忽略了什么吗?尾部返回类型语法是否在某种程度上低于我没有想到的?
对于一个错字,我a留在那里.当我去编译时,编译器报告:
'a'和'f'的声明之间缺少','
码:
int a
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
因为我从来没有得到任何这样的错误信息,而且我不知道我可以在那里放一个逗号并且它编译得很好(在我测试的多个编译器中),这是非常令人惊讶的:
int a,
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
但当然这不是我的意图,而是int f(void){}代替.我尝试了另一个编译器,但它没有用,并报告了这样的语法错误(在clang中):
错误:预期';' 在顶级声明者之后.
我的问题是:哪一个是正确的?它应该或不应该编译?标准对这种行为有什么看法?
我不打算使用它,因为把变量和函数分成逗号有点难看(就像它是函数原型一样).我只是好奇.
编辑:添加void在函数参数中.其实我想用空参数写一个函数
->最近,我在学习函数声明时在 Python 3 中遇到了这个问题。这是什么意思?到目前为止,除了 Javascript 函数声明之外,我还从未见过这样的声明。
def f(self, s: 'str') -> 'bool':
pass
Run Code Online (Sandbox Code Playgroud) 这两个声明有什么区别:
double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)
它们似乎都在 GCC 中使用相同的调用:
math_operation(2.0, sqrt);
Run Code Online (Sandbox Code Playgroud)
它只是语法糖还是更多?
c function-pointers implicit-conversion function-declaration
我知道你可以像这样声明一个没有任何参数的函数:
void test()
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
但我也见过
void test(void)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
和
void test(void*)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是: usingvoid和void*here 有什么区别?
与 C 相比,我更喜欢 C++,但这个简单的代码示例让我大吃一惊:
int foo() {
return 3;
}
int main() {
int x;
foo(&x);
return x;
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/4ov9nTzjM
没有警告,没有链接问题,但此代码仍然无效。
当一些初学者用具有这个奇怪问题的代码提出问题时,我偶然发现了这一点。有人在其他网站(非英语网站)上提出了问题,我想向他提供更好的解释为什么它可以编译(并了解一些有关 C 的知识)。如果有人需要的话,他的原始代码。
我怀疑这个sis在某种程度上与隐式函数声明有关,但我不完全确定。为什么编译器不会抱怨foo使用参数调用?
这是一个程序集:
foo:
push rbp
mov rbp, rsp
mov eax, 3
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
lea rax, [rbp-4]
mov rdi, rax
mov eax, 0
call foo
mov eax, DWORD PTR [rbp-4]
leave
ret
Run Code Online (Sandbox Code Playgroud)
如您所见,x仍未初始化。
c ×5
c++ ×3
auto ×1
c++11 ×1
c-strings ×1
declaration ×1
function ×1
haskell ×1
python ×1
python-3.x ×1
recursion ×1
return-type ×1
syntax ×1
typedef ×1
void ×1