Wal*_*oun 3 c c++ gcc strcmp visual-studio-2015
我的印象是比较运算符没有为C风格的字符串定义,这就是为什么我们使用类似的东西strcmp().因此,以下代码在C和C++中是非法的:
if("foo" == "foo"){
printf("The C-style comparison worked.\n");
}
if("foo" == "bob"){
printf("The C-style comparison produced the incorrect answer.\n");
} else {
printf("The C-style comparison worked, strings were not equal.\n");
}
Run Code Online (Sandbox Code Playgroud)
但我在使用GCC和VS 2015的两个Codeblock中测试了它,编译为C和C++.两者都允许代码并产生正确的输出.
比较C风格的字符串是否合法?或者它是否是允许此代码工作的非标准编译器扩展?
如果这是合法的,那么为什么人们strcmp()在C中使用?
rem*_*s4e 12
编译器可以自由地使用字符串实习,即通过避免复制相同的数据来节省内存."foo"比较相等的2个文字必须存储在您的案例中的相同内存位置.
但是,您不应该将此作为规则.该strcmp方法可以在所有情况下工作,而实现定义您的观察是否将与另一个编译器,编译器版本,编译标志集等保持一致.
P.P*_*.P. 11
该代码在C中是合法的.它可能不会产生您期望的结果.
字符串文字的类型char[N]在C和const char[N]C++中,其中N是字符串文字中的字符数.
"foo"是类型char[4],const char[4]分别是C和C++.基本上它是一个数组.在表达式中使用时,数组将转换为指向其第一个元素的指针.所以在比较中,if("foo" == "foo")字符串文字被转换为指针.因此,"地址比较".
在比较中,
if("foo" == "foo"){
Run Code Online (Sandbox Code Playgroud)
比较字符串文字的地址,它们可能相同也可能不相等.
它相当于:
const char *p = "foo";
const char *q = "foo";
if ( p == q) {
...
}
Run Code Online (Sandbox Code Playgroud)
C标准不保证两个字符串文字的地址是相同的,具有相同内容("foo"此处的)放在同一位置.但实际上,任何编译器都会放在同一个地址上.所以比较似乎有效.但你不能依赖这种行为.
6.4.5,字符串文字(C11,草稿)
如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
同样,这种比较
if("foo" == "bob"){
...
}
Run Code Online (Sandbox Code Playgroud)
相当于:
const char *x = "foo";
const char *y = "bob";
if("foo" == "bob"){
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,字符串文字将位于不同的位置,指针比较失败.因此,在这两种情况下,看起来==操作符实际上都用于比较C字符串.
相反,如果你使用数组进行比较,它将无法工作:
char s1[] ="foo";
char s2[] = "foo";
if (s1 == s2) {
/* always false */
}
Run Code Online (Sandbox Code Playgroud)
不同之处在于,当使用字符串文字初始化数组时,会将其复制到数组中.数组s1和s2地址不同,永远不会相等.但是,在字符串中,两者的情况下p,并q指向同一个地址(假定编译器的地方,这样-这不是如上所述保证).
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |