c语言 这段代码是啥意思,结果为啥是20,20

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 这段代码是啥意思,结果为啥是20,20相关的知识,希望对你有一定的参考价值。

int **pp,*p,a=10,b=20;
pp=&p;
p=&a;
p=&b;
printf("%d,%d\n",*p,**pp);

这个是考的指针,PP是二级指针,P是一级指针
pp=&p;这句是将P指针的地址赋给PP(注:要将变量的地址赋给一级指针;要将一级指针的地址赋给二级指针) p=&a; 这句是给P赋值,主要就是迷惑学生的 p=&b;这句又是给P赋值,为变量b的地址printf("%d,%d\n",*p,**pp);注意*是&的逆运算,就像+与-之间的关系,*P就是输出指针P所指向的变量值;**P就是输出指针PP所指向的指针所指向的变量值,其实两个输出指向是完全相同的,即P所指向的变量b的值,为20.(希望你能看懂)
参考技术A 一级指针p指向了b,打印*p就是打印b的值:20
二级指针p指向了p,间接指向p,**p就是b的值:20

string::npos 在这段代码中是啥意思?

【中文标题】string::npos 在这段代码中是啥意思?【英文标题】:What does string::npos mean in this code?string::npos 在这段代码中是什么意思? 【发布时间】:2011-04-19 04:20:30 【问题描述】:

下面这段代码中的std::string::npos是什么意思?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

【问题讨论】:

【参考方案1】:

表示没有找到。

通常是这样定义的:

static const size_t npos = -1;

最好与 npos 进行比较而不是 -1,因为代码更易读。

【讨论】:

比较 == -1 也可能使一些人认为他们可以将其转换为 只是想知道是否有人遇到过这个问题,还是只有我……我在 Windows 中运行 cout&lt;&lt;"pos: "&lt;&lt;str.find("not in the string")&lt;&lt;" npos: "&lt;&lt;std::string::npos; 并得到 pos:4294967295 npos: 4294967295,但在 Mac 上运行时得到 pos:4294967295 npos: 18446744073709551615。这似乎不对......好吧,我建议以任何方式与-1而不是std::string::npos进行比较 @user1135469 如果您看到 codaddict bellow (***.com/a/3827997/752842) 或 Sebastian Raschka 的回答,我认为您得到的将是有意义的。我建议使用 npos,因为我尝试使用 -1,但在我使用它的条件下它无法正常工作。【参考方案2】:

string::npos 是一个常量(可能是-1),代表一个非位置。未找到模式时,由方法 find 返回。

【讨论】:

+1 用于实际显示易于记忆的 npos = no-pos 推导。很明显,一旦你知道它就不会考虑它,但对于第一次看到这些字母的人来说,它可能不会点击......? 错在47个级别...npos是size_t,这意味着它不能是负数...真正的意思是max_index,18446744073709551615 for 64 bit size_t【参考方案3】:

string::npos 的文档说:

npos 是一个静态成员常量值,对于 size_t 类型的元素具有最大可能值。

作为返回值,通常用于表示失败。

这个常数实际上是用 -1 的值定义的(对于任何 trait),因为 size_t 是一个无符号整数类型,所以它成为该类型的最大可能表示值。

【讨论】:

【参考方案4】:

size_t 是一个无符号变量,因此“无符号值 = - 1”自动使其成为 size_t 的最大可能值:18446744073709551615

【讨论】:

size_t 对于 32 位编译器是无符号整数; unsigned long long int 用于 64 位编译器。将其设置为 -1 使其具有该无符号类型的最大值。【参考方案5】:

std::string::npos 是实现定义的索引,始终超出任何std::string 实例的范围。各种std::string 函数返回或接受它以发出超出字符串结尾的信号。它通常是一些无符号整数类型,它的值通常是std::numeric_limits&lt;std::string::size_type&gt;::max (),这(感谢标准整数提升)通常与-1相当。

【讨论】:

【参考方案6】:

found 将是npos,以防在搜索字符串中找不到子字符串。

【讨论】:

【参考方案7】:

我们必须使用 string::size_type 作为 find 函数的返回类型,否则与 string::npos 的比较可能不起作用。 size_type,由字符串的分配器定义,必须是unsigned 积分型。默认分配器 allocator 使用类型size_t 作为size_type。因为-1 是 转换为无符号整数类型,npos 是其类型的最大无符号值。然而, 确切的值取决于类型size_type 的确切定义。不幸的是,这些最大 值不同。事实上,(unsigned long)-1(unsigned short)-1 不同,如果 类型不同。因此,比较

idx == std::string::npos

如果 idx 的值为 -1 并且 idx 和 string::npos 具有不同的类型,则可能会产生 false:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos)  // ERROR: comparison might not work
...

避免此错误的一种方法是直接检查搜索是否失败:

if (s.find("hi") == std::string::npos) 
...

但是,通常您需要匹配字符位置的索引。因此,另一个简单的解决方案 是为npos定义你自己的签名值:

const int NPOS = -1;

现在比较看起来有点不同,而且更方便:

if (idx == NPOS)  // works almost always
...

【讨论】:

【参考方案8】:
$21.4 - "static const size_type npos = -1;"

它由指示错误/未找到等的字符串函数返回。

【讨论】:

【参考方案9】:

当我们有 std::optional 时,对这些天 C++17 的回答:

如果你眯着眼睛假装std::string::find() 返回一个std::optional&lt;std::string::size_type&gt;(它应该...) - 那么条件变成:

auto position = str.find(str2);

if ( position.has_value() ) 
    std::cout << "first 'needle' found at: " << found.value() << std::endl;

【讨论】:

【参考方案10】:

string::npos 的值为 18446744073709551615。如果没有找到字符串,则返回该值。

【讨论】:

实际值是实现定义的,无关紧要。然而,在实践中,18446744073709551615 的值是 64 位 std::size_t 的典型值,它是最大 64 位无符号值。【参考方案11】:

static const size_t npos = -1;

size_t 的最大值

npos 是一个静态成员常量值,对于 size_t 类型的元素具有最大可能值。

这个值,当用作字符串成员函数中 len(或 sublen)参数的值时,意思是“直到字符串的结尾”。

作为返回值,通常用于表示不匹配。

这个常数定义为 -1,因为 size_t 是一个无符号整数类型,它是这个类型的最大可能表示值。

【讨论】:

【参考方案12】:

正如其他人提到的,string::npos 是 size_t 的最大值

这是它的定义:

static constexpr auto nposstatic_cast<size_type>(-1);

疑惑的是,错误的答案得到了投票。

这是一个快速测试示例:

int main()

    string s = "C   :";
    size_t i = s.rfind('?');
    size_t b = size_t (-1);
    size_t c = (size_t) -1;
    cout<< i <<" == " << b << " == " << string::npos << " == " << c;

    return 0;

输出:

18446744073709551615 == 18446744073709551615 == 18446744073709551615 == 18446744073709551615

...Program finished with exit code 0

【讨论】:

以上是关于c语言 这段代码是啥意思,结果为啥是20,20的主要内容,如果未能解决你的问题,请参考以下文章

c语言中10010100为啥是-20

C#中 Vector的用法

这段代码的作用是啥,使用的每个符号是啥意思?使用的语言是 C,我只是编码的初学者

c语言字符串比较函数strcmp是啥意思

用简单的描述告诉我C语言 sprintf函数是啥意思。

请问这段C#代码为啥结果是CBA?