while(*pAction && *pAction != '^A') 中'^A'是什么意思.没见过这样的字符表示.

z341223318 2008-02-18 09:49:09
while(*pAction && *pAction != '^A') 中'^A'是什么意思.
没见过这样的字符表示.
谢谢指点!
...全文
587 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsocpp 2008-02-26
  • 打赏
  • 举报
回复
单引号怎么可以中包含那么多字符啊?
‘ABC'??这类的可能就截取最后一个字符吧
liyuzhu_1984 2008-02-26
  • 打赏
  • 举报
回复
'^A' 就我知道的是 以A为结束标志的字符串
yisea123 2008-02-25
  • 打赏
  • 举报
回复
正确的应该是:

'^A'是一个ASCII字符,即SOH,不过是非打印的
'^A'相当于'\001'

在cmd命令行中,先按住alt,然后按小键盘中的1,最后松开按alt的手
你就会看到 '^A'

依此先按住alt,然后依次按小键盘中的6,5 ,最后松开按alt的手
你就会看到'A'
wushichao1987 2008-02-24
  • 打赏
  • 举报
回复
整型数(一般为16为或32位)的存储空间可以容纳多个字符(一般是八位),因此有的C编译器允许在一个字符常量(以及字符串常量)中包括多个字符。
也就是说,用'yes'代替"yes"不会被编译器检测到。后者(即"yes")的含义是“一次包含'y','e','s'以及空字符'\0'的4个内存单元的首地址”。
前者(即'yes')的含义并没有准确的进行定义,但大多数C编译器理解为,“一个整数值,有'y','e','s'所代表的整数值按照特定编译器实现中定义的方式组合得到”。因此,这两者如果在数值上有什么相似之处,也完全是一种巧合而已。
(注:在Borland C++ v5.5和LCC v3.6中采取的做法是,忽略多余的字符,最后的整数值即第一个字符的整数值;而在Visual C++ 6.0和GCC v2.95中采取的做法是,依次用后一个字符覆盖前一个字符,最后得到的整数值即最后一个字符的整数值。)

以上摘自《C陷阱与缺陷》第12页
Oversense 2008-02-22
  • 打赏
  • 举报
回复
谁写的程序啊,明明是打错了一个字而已,碰巧又对了.
xstong1982 2008-02-22
  • 打赏
  • 举报
回复
看了msdn上对operator ' '的解释,原来'text'就是Treats 'text' as a string.
以前一直以为''括起来的只能是单个字符。。。
mxling 2008-02-21
  • 打赏
  • 举报
回复
c2按字符输出时被截断,只输出低位的四个字节????
wushichao1987 2008-02-21
  • 打赏
  • 举报
回复
谢谢27楼的回复,我明白了。c2按字符输出时被截断,只输出低位的四个字节。看来可以结贴了!
baihacker 2008-02-20
  • 打赏
  • 举报
回复
mark 学习一下
wushichao1987 2008-02-20
  • 打赏
  • 举报
回复
又有新发现,看了十二楼的回复测试了下正确,但是有新问题,代码如下:
#include <stdio.h>
#include <stdlib.h>

int main(){
int c1 = 'c' ;
int c2 = 'abc' ;
printf( "int_c1 = %d\n" , c1 ) ;
printf( "char_c1 = %c\n" , c1 ) ;
printf( "int_c2 = %d\n" , c2 ) ;
printf( "char_c2 = %c\n" , c2 ) ;
system("pause") ;
}

测试环境同样是devc++,输出结果如下:
int_c1 = 99
char_c1 = c
int_c2 = 6382179
char_c2 = c

如果c2='abc'取值为最后一个字符,那么为什么用int格式输出时却不正确,char类型以int形式输出应该没有问题,前两个输出也证明了这点,但是第三个输出却无法解释。期待高人!
brookmill 2008-02-20
  • 打赏
  • 举报
回复
这是刚才那段代码的汇编码。现在明白了,编译器直接把几个字符拼在一块当整数了,很意外。
; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.762 

TITLE tmp.c
.686P
.XMM
include listing.inc
.model flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

_DATA SEGMENT
$SG2242 DB '0x%x', 0aH, 00H
ORG $+2
$SG2243 DB '0x%x', 0aH, 00H
ORG $+2
$SG2244 DB '0x%x', 0aH, 00H
ORG $+2
$SG2245 DB '0x%x', 0aH, 0aH, 00H
ORG $+1
$SG2246 DB '0x%x', 0aH, 00H
ORG $+2
$SG2247 DB '0x%x', 0aH, 00H
ORG $+2
$SG2248 DB '0x%x', 0aH, 00H
ORG $+2
$SG2250 DB '0x%x', 0aH, 00H
ORG $+2
$SG2252 DB '0x%x', 0aH, 00H
ORG $+2
$SG2254 DB '0x%x', 0aH, 00H
_DATA ENDS
PUBLIC _main
EXTRN _printf:PROC
; Function compile flags: /Odtp
_TEXT SEGMENT
_main PROC
; File tmp.c
; Line 5
push ebp
mov ebp, esp
; Line 6
push 94 ; 0000005eH
push OFFSET $SG2242
call _printf
add esp, 8
; Line 7
push 38 ; 00000026H
push OFFSET $SG2243
call _printf
add esp, 8
; Line 8
push 124 ; 0000007cH
push OFFSET $SG2244
call _printf
add esp, 8
; Line 9
push 65 ; 00000041H
push OFFSET $SG2245
call _printf
add esp, 8
; Line 11
push 24129 ; 00005e41H
push OFFSET $SG2246
call _printf
add esp, 8
; Line 12
push 6170177 ; 005e2641H
push OFFSET $SG2247
call _printf
add esp, 8
; Line 13
push 1579580481 ; 5e267c41H
push OFFSET $SG2248
call _printf
add esp, 8
; Line 14
push 65 ; 00000041H
push OFFSET $SG2250
call _printf
add esp, 8
; Line 15
push 65 ; 00000041H
push OFFSET $SG2252
call _printf
add esp, 8
; Line 16
push 65 ; 00000041H
push OFFSET $SG2254
call _printf
add esp, 8
; Line 17
xor eax, eax
; Line 18
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
brookmill 2008-02-20
  • 打赏
  • 举报
回复
我写了一段代码在VC里试了一下,结果如下。
不知道编译器是怎么处理的,感觉和^、&之类的无关。
#include   <stdio.h> 

int main(void)
{
printf("0x%x\n", '^');
printf("0x%x\n", '&');
printf("0x%x\n", '|');
printf("0x%x\n\n", 'A');

printf("0x%x\n", '^A');
printf("0x%x\n", '^&A');
printf("0x%x\n", '^&|A');
printf("0x%x\n", (char)'^A');
printf("0x%x\n", (char)'^&A');
printf("0x%x\n", (char)'^&|A');
return 0;
}

0x5e
0x26
0x7c
0x41

0x5e41
0x5e2641
0x5e267c41
0x41
0x41
0x41
wushichao1987 2008-02-20
  • 打赏
  • 举报
回复
大家看一下这个程序
#include <stdio.h>
#include <stdlib.h>

int main(){
int n ;
printf( "^ = %d\n" , '^' ) ;
printf( "A = %d\n" , 'A' ) ;
printf( "^A = %d\n\n" , '^A' ) ;
printf( "#A = %d\n" , '#A' ) ;
fflush(stdin);
printf( "please enter:" ) ;
scanf( "%d" , &n ) ;
if( n != '^A')
printf( "Error\n" ) ;
else
printf( "Right\n") ;
system("pause") ;
}

测试环境是devc++,警告信息是
29 C:\Documents and Settings\red\桌面\Untitled2.cpp:8 [Warning] multi-character character constant
27 C:\Documents and Settings\red\桌面\Untitled2.cpp:9 [Warning] multi-character character constant
14 C:\Documents and Settings\red\桌面\Untitled2.cpp:13 [Warning] multi-character character constant
两个程序运行结果如下:
^ = 94
A = 65
^A = 24129

#A = 9025
please enter:65
Error
请按任意键继续. . .

^ = 94
A = 65
^A = 24129

#A = 9025
please enter:24129
Right
请按任意键继续. . .

楼上的没看太明白,我不懂汇编。谁给解释一下。。。。
liufangbj 2008-02-20
  • 打赏
  • 举报
回复
跑哪去了
llyy112233 2008-02-20
  • 打赏
  • 举报
回复
学习
有点不懂
brookmill 2008-02-20
  • 打赏
  • 举报
回复
答26楼:这个问题不用期待高人:)
int_c2 = 6382179
/*
* 6382179 = 0x616263
* a -- 0x61
* b -- 0x62
* c -- 0x63
*/
iambic 2008-02-20
  • 打赏
  • 举报
回复
从输出结果就看得很清楚了,哪用得着汇编。
visame 2008-02-20
  • 打赏
  • 举报
回复
汇编语言,很重要啊。
ltc_mouse 2008-02-19
  • 打赏
  • 举报
回复
建议关注下编译器的warnings提示
fengganjing 2008-02-19
  • 打赏
  • 举报
回复
与或
加载更多回复(16)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧